Jinja
Jinja是仿照Django模板的Python模板语言。具有速度快,提供了可选的沙箱模板执行环境来保证安全的优点。
Jinja具有以下的的特性:
- 在沙箱中执行
- 强大的HTML自动转义系统保护系统免受XSS攻击
- 支持模板继承
- 即时编译最优的python。,
- 可选提前编译模板的时间
- 易于调试,异常的行数直接指向模板中的对应行
- 可配置的语法
基本使用
Jinja的基本使用方法
通过Template创建一个模板并且渲染,如果模板不是从字符串加载,而是文件系统或者别的数据源,这不是一个官方推荐的方式。
from jinja2 import Template
template = Template("Hello {{name}}!")
template.render(name="AbeyQ_Q")
通过创建一个Template实例,将会得到新的template对象,提供一个名为render()的方法,该方法有字典或关键字参数的时候回调用扩充模板。字典或关键字参数会被传递给模板,即模板的“上下文”。
Jinja基础
Jinja2使用一个Environment中心对象。这个类的实例用于存储配置、全局对象,并且用于从文件系统或者其他位置加载模板。即使通过class:Template类的构造函数用字符串创建模板,也会创建一个环境(该环境是共享的)。
应用初始化的时候创建一个Environment对象,并且用来加载模板。
jinja2给应用加载文档的最简单方式为:
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))
会创建一个默认设置的模板环境和一个在‘yourapplication python’包中的templates文件夹中寻找模板的加载器。
如果想从数据库或者其他资源加载模板可以使用get_template()方法从环境中加载模板,并且会返回已经加载的Template对象。
template = env.get_template('my_template.html')
渲染的时候使用template.render 进行变量渲染
Jinja自定义Filter
变量可以通过过滤器(Fileter)修改。过滤器与变量用管道符进行分割,而且可以通过圆括号进行可选参数的传递。多个过滤器可以链式调用,前一个过滤器的输出会被作为后一个过滤器的输入。
自定义过滤器只是常规的Python函数,过滤器左边作为第一个参数,其余的参数作为额外的参数活关键字参数传递到过滤器。需要更新环境的filters字段来将自定义的过滤器注册到模板环境上。
# 定义过滤器
def datetimeformat(value, format="%H:%M / %d-%m-%Y"):
return value.strftime(format)
# 注册定义的过滤器到模板环境上
environment.filters['datetimeformat'] = datetimeformat
需要注意的是在使用自定义的Filter的时候,需要在将要使用该过滤的模板初始化之前将这个过滤器注册到模板环境,否则会在使用自定义的Filter的时候出现找不到定义过的(注册过的)自定义的Filter。