首先逐个分析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模板系统的内部工作原理,包括模板加载、词法解析、语法解析及渲染流程。通过具体实例展示了如何利用Django强大的模板语言进行高效的内容替换。
1998

被折叠的 条评论
为什么被折叠?



