本文是基于Jinja2中文手册,以及 Jinja2 简明使用手册所做的笔记。
1 Jinja2
Jinja2是基于python的模板引擎,之前在编写廖雪峰的web开发的时候接触过,在Day5以及Day8都有涉及到。
1.1 Environment
类
Environment
是Jinja2中的一个核心类,它的实例用来保存配置、全局对象,以及文件路径用于加载模板。
配置Jinja2来为应用添加模板的步骤大致是:
- 创建
Environment
实例 - 使用
get_template()
加载模板 - 使用
render()
方法来渲染模板
1.1.1 创建Environment
实例
现在结合廖雪峰的web开发实战一同说明,在Day5构建web框架的时候就有初始化Jinja2模板,这步骤就相当于创建Environment
实例,创建Environment
实例需要接受主要参数有(基本都有默认值):
loader
:模板加载器,形式是loader=FileSystemLoader(path)
,其中的path
表示的是模板的文件路径。block_start_string
:模块开始标记符,默认值{%
block_end_string
:模块结束标记符,默认值%}
variable_start_string
:变量开始标记符,默认值{ {
variable_end_string
:变量结束标记符,默认值}}
auto_reload
:是一个布尔值,如果设定为True
,则当模板发生改动时会自动重载autoescape
:是一个布尔值,默认值为False
,如果设置为True
,在渲染模板时,会自动将模板转义实体字符,此时使用safe
过滤器可以使不需转义的渲染变量不转义,如{ { user.username|safe }}
filters
:过滤器,多数用于渲染变量标记符的时候,在渲染模板时其语法形式是{ {args|function}}
(结合day8中的时间过滤器)。过滤器不是创建Environment
实例的参数,它是以方法的形式绑定在Environment
实例上,如Env.filters[FunctionName]=function
1.1.2 get_template()
加载模板,render()
方法来渲染模板
在创建好Environment
实例后,可以使用其get_template(templateName)
方法来加载模板,再使用render(**dict)
来渲染模板(通俗点就是变量代入),注意这是一个链式env.get_template(templateName).render(**dict)
,可以结合day5中的middleware factory
中的代码。
1.2 结构控制标记
在Jinja2模板中渲染的目标以结构控制标记符来定义,结构标记符基本有以下几种:
{ { variable }}
:用于直接替换传入数据{% extends '__base__.html' %}
:用于子模板继承父模板{% block blockName %}...{% endblock %}
:用于父模板与子模版之间的渲染,注意blockName
的命名必须是唯一的{% if boolean %}...{% elseif boolean %}...{% else %}...{% endif %}
:条件判断标记{% for item in items %}
:循环控制标记{% marco function(x) %}..function..{% endmarco %}
:宏,用于定义函数,此后该模板任意部位都可以直接调用functon(x)
,如{ {function(123)}}