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

来源:互联网 发布:ubuntu默认字体 编辑:程序博客网 时间:2024/05/20 03:45

上一节模糊的分析了一下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 parserbuiltins = []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.tagdef 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)@stringfilterdef capfirst(value):    """Capitalizes the first character of the value."""    return value and value[0].upper() + value[1:]

通过2个装饰器注册1个过滤方法。
传递到函数的内容为安全的字符串。然后首字母大写返回。


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


比较感兴趣的是tag和filter使用。使得代码写起来很优雅。但是理解起来很麻烦。要好好学习。