深入学习Django源码基础11 - 简要分析Django中template模块1

首先逐个分析template目录下的文件

template
    |----loaders
        |----__init__.py
        |----app_directories.py
        |----cached.py
        |----eggs.py
        |----filesystem.py
    |----__init__.py
    |----base.py					模版,token,词法分析器,语法分析器,token解析,过滤表达式。变量,节点,节点列表,文本接点,变量节点,标签帮助节点,节点库
    |----context.py					内容类,渲染内容类,请求内容类(增加中间键过滤)
    |----debug.py					包装调试打印
    |----defaultfiters.py				过滤关键字
    |----defaulttags.py				标签关键字
    |----loader.py					模版加载公共方法
    |----loader_tags.py				包内容,包节点,扩展节点,包含接点,
    |----response.py				返回请求封装,模版返回封装类
    |----smartif.py					表达式过滤

实际使用过程中是这样
html代码
{% for story in story_list %}
<h2>
  <a href="{{ story.get_absolute_url }}">
    {{ story.headline|upper }}
  </a>
</h2>
<p>{{ story.tease|truncatewords:"100" }}</p>
{% endfor %}

后台

class PersonClass2:
...     def name(self):
...         return "Samantha"
>>> t = Template("My name is {{ person.name }}.")
>>> t.render(Context({"person": PersonClass2}))

from django.shortcuts import render_to_response
render_to_response('xxx.html', {})


通过分析可以得出
Template加载模版资源
通过词法分析器lexer拆分为词法列表
拆分以后的词法经过语法分析器。建立语法树。
渲染的过程为遍历语法树,将语法通过对应关键字方法和过滤方法。实现内容替换。

其中有3个关键过程。

1:词法解析

2:语法解析,建立语法树,执行语法关键字与内容替换。

3:渲染过程中,执行语法关键字与内容替换。


词法的解析在base.py中定义lexer类。重点为

# template syntax constants
BLOCK_TAG_START = '{%'
BLOCK_TAG_END = '%}'
VARIABLE_TAG_START = '{{'
VARIABLE_TAG_END = '}}'
COMMENT_TAG_START = '{#'
COMMENT_TAG_END = '#}'

# match a variable or block tag and capture the entire tag, including start/end
# delimiters
tag_re = (re.compile('(%s.*?%s|%s.*?%s|%s.*?%s)' %
          (re.escape(BLOCK_TAG_START), re.escape(BLOCK_TAG_END),
           re.escape(VARIABLE_TAG_START), re.escape(VARIABLE_TAG_END),
           re.escape(COMMENT_TAG_START), re.escape(COMMENT_TAG_END))))

正则的组合。也就是过滤 {{ }} {% %} {# #} 3种。

如果是变量类型,构造变量表达式节点。如果是block类型,构造block节点。

接下来看渲染的内容部分Context,其中主要是封装1个[{key:value}]列表。用来渲染时候索引值。


那么剩下的问题就是如何建立关键字和过滤。

你可能感兴趣的:(深入学习Django源码基础11 - 简要分析Django中template模块1)