django源码分析-template模块分析


该模块实现django的模板引擎,django模板引擎可以使用自身的模板引擎和Jinja2,如果使用Jinja2,需要安装:

pip install Jinja2

当我们创建好django项目后,在settings.py配置文件中有一部分就是对django模板的配置:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            # ... some options here ...
        },
    },
]

django模板语法包括:

  • 变量 : {{bar}}
  • 标签 : {% if xxx %}
  • 过滤器: {{foo|title}}
  • 注释 : {% comment %}

django 模板的组件包括:

  • 引擎 : django.template.Engine
  • 模板 : django.template.Template
  • 上下文 : django.template.Context
  • 加载器 : 模板加载器负责定位模板,加载它们,并返回模板对象.
  • 上下文处理器 : Context处理器是这样的函数:接收当前的 HttpRequest 作为参数,并返回一个 字典,该字典中包含了将要添加到渲染的context中的数据。

下面我们来分析django 模板模块的具体内容:

  • backends : 该模块是django模板的后端实现,分为django默认模板和Jinja2。
  • loaders:就是django 模板系统默认加载器。
  • init.py :django 模板系统初始化文件。
  • base.py :django模板系统基类,我们来看看这些组件是如何工作的。
>>> from django import template
>>> s = '<html>{% if test %}<h1>{{ varvalue }}</h1>{% endif %}</html>'
>>> t = template.Template(s)

(t is now a compiled template, and its render() method can be called multiple
times with multiple contexts)

>>> c = template.Context({'test':True, 'varvalue': 'Hello'})
>>> t.render(c)
'<html><h1>Hello</h1></html>'
>>> c = template.Context({'test':False, 'varvalue': 'Hello'})
>>> t.render(c)
'<html></html>'
  • context_processors.py : django模板上下文处理器,一组请求处理器,将字典合并成一个模板上下文。每个函数将请求对象作为唯一的参数。并返回一个字典以添加到上下文中。
  • context.py : django模板上下文,携带一个字典内容,来渲染页面。
  • defaultfilters.py :django模板过滤器实现。
  • defaulttags.py : django 模板默认标签实现。
  • engine.py :django模板引擎。
  • exceptions.py :django模板异常。
  • library.py : django模板用于注册模板标签和过滤器的类。编译过滤器,模板标签函数存储在筛选器和标签属性中。
  • loader_tags.py : 标签加载器,包含各种标签节点,例如:块节点(BlockNode)、继承节点(ExtendsNode)、包含节点(IncludeNode)。
  • loader.py :加载器,负责定位模板,加载它们,并返回模板对象。
  • response.py :django 模板响应类。
  • smartif.py : if标签解析工具类。
  • utils.py : django 模板工具类。

更多Django教程

学习更多Django教程