您的位置:首页 > 编程语言 > Go语言

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

2013-09-10 11:48 906 查看
上一节模糊的分析了一下template的过程。

这节也模糊的分析一下关键字与过滤的过程。

在分析模版内容时候,构造语法问题树的过程初始化代码中有

def add_library(self, lib):
self.tags.update(lib.tags)
self.filters.update(lib.filters)


# global list of libraries to load by default for a new parser
builtins = []

for lib in builtins:
self.add_library(lib)
加载全局lib。
在base.py文件底部有
def import_library(taglib_module):
try:
mod = import_module(taglib_module)
except ImportError as e:
if is_library_missing(taglib_module):
return None
else:
raise InvalidTemplateLibrary("ImportError raised loading %s: %s" %
(taglib_module, e))
try:
return mod.register
except AttributeError:
raise InvalidTemplateLibrary("Template library %s does not have "
"a variable named 'register'" %
taglib_module)

def add_to_builtins(module):
builtins.append(import_library(module))
add_to_builtins('django.template.defaulttags')
add_to_builtins('django.template.defaultfilters')


因此是buildtins中内容为 template.defaulttags.reigster和template.defaultfilters.register

register = Library()

Library在base中定义。其中包含tags与filters。

分析tags中使用

@register.tag
def comment(parser, token):
"""
Ignores everything between ``{% comment %}`` and ``{% endcomment %}``.
"""
parser.skip_past('endcomment')
return CommentNode()


通过装饰器定义1个comment关键字。关键字对应语法树中的节点为

class CommentNode(Node):
def render(self, context):
return ''


分析filters中使用

@register.filter(is_safe=True)
@stringfilter
def capfirst(value):
"""Capitalizes the first character of the value."""
return value and value[0].upper() + value[1:]


通过2个装饰器注册1个过滤方法。

传递到函数的内容为安全的字符串。然后首字母大写返回。

在语法树解析和渲染过程中,通过tags和filters。注册的关键字解析。

比较感兴趣的是tag和filter使用。使得代码写起来很优雅。但是理解起来很麻烦。要好好学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: