本文最后更新于:2025年8月13日 晚上
Jinja2 是一个 Python 的功能齐全的模板引擎。它有完整的 unicode 支持,一个可选 的集成沙箱执行环境,被广泛使用,以 BSD 许可证授权,本文记录相关内容。
简介
Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全。
Jinja2 需要至少 Python 2.4 版本来运行。此外,如果你使用 Python 2.4 ,一个可 以创建 python 扩展的可用的 C 编译器会为调试器安装。
特性:
- 沙箱中执行
- 强大的 HTML 自动转义系统保护系统免受 XSS
- 模板继承
- 及时编译最优的 python 代码
- 可选提前编译模板的时间
- 易于调试。异常的行数直接指向模板中的对应行。
- 可配置的语法
为什么要叫Jinja?
之所以叫Jinja,是因为日本的神社(Jinja)英文单词是temple,而模板的英文是template,两者发音很相似(这么说来,它本来也有可能叫Miao的……)。
Jinja的速度怎么样?
和Mako差不多,但比Genshi以及Django的模板引擎快10~20倍。
安装
1 |
|
基本 API 使用
最基本的方式就是通过 Template 创建一个模板并渲染它。
1 |
|
通过创建一个 Template 的实例,你会得到一个新的模板对象,提供一 个名为 render() 的方法,该方法在有字典或关键字参数时调用 扩充模板。字典或关键字参数会被传递到模板,即模板“上下文”。
- 如果需要结合 Word 的模板:
1 |
|
模版引擎
在Python中,什么是模版?就是在一个静态HTML加入一些类似变量的标签,然后引擎在渲染这个HTML时候会动态的把变量填入内容,生成一个最终的HTML。
什么是模版引擎?其实就是一种能解析类似Python语言
的标记语言的解释器。
Jinja2是一个模版语言,只是类似Python,比较符合Python语法,但不完全相同!
所有的模版引擎,实际上都差不多,不管是基于VBS语言的ASP模版,还是基于PHP语言的PHP模版,都不是与原本语言一摸一样,而只是做到尽量一样而已。
语言基础
注意:Jinja2
模版语言,是不区分缩进的,和纯python不同。实际上所有模版语言都不区分缩紧。
常用标记:
示例:
1 |
|
Delimiters(分隔符)
1 |
|
Variables
除了普通的字符串变量,Jinja2还支持列表、字典和对象,你可以这样获取变量值:
1 |
|
statements: 可以用来创建条件和循环等等
1 |
|
从上文中第二个variable的例子中可以看出,Jinja2支持使用带过滤器的Unix型管道操作符。有很多的内置过滤器可供使用。
我们可以仅仅用一堆简单if和for就可以建立建立几乎任何的常规配置文件。不过如果你有意更进一步,Jinja2 Documentation包含了很多有趣的东西可供了解。我们可以看到Ansibe允许在模板中使用一些额外的模版变量。
按照Ansible template_module, 我们模板的示例:
1 |
|
我们同样可以发现在Ansible Facts中有很多可用的Ansible变量。
获取一个变量的属性有两种方式:
1 |
|
Filter
一个filter过滤器的本质就是一个function函数。使用格式为:变量名 | 函数
。
它做到的就是,把变量传给函数,然后再把函数返回值作为这个代码块的值。
如:
链式调用(管道式):
和命令行的pipline管道一样,可以一次调用多个函数(过滤器),如:
文本块调用(将中间的所有文字都作为变量内容传入到过滤器中):
1 |
|
Jinja2常用过滤器
字符串操作:
列表操作:
1 |
|
Tests
Jinja2提供的tests可以用来在语句里对变量或表达式进行测试,如果要测试一个变量,可以在变量后加上“is”和test名,比如:
1 |
|
如果要传入参数,可以在test后增加括号,也可以直接写在后面。
For
循环浏览序列中的每个项目。例如,要显示名为 users 的变量中提供的用户列表:
1 |
|
由于模板中的变量保留了它们的对象属性,因此可以迭代像 dict 这样的容器:
1 |
|
循环索引
- loop.index: 循环当前迭代(从1开始)。
- loop.index0: 循环当前迭代(从0开始)。
- loop.revindex: 循环迭代的数量(从1开始)。
- loop.revindex0: 循环迭代的数量(从0开始)。
- loop.first: 是否为迭代的第一步。
- loop.last: 是否为迭代的最后一步。
- loop.length: 序列中元素的数量。
If
Jinja 中的 if 语句与 Python if 语句相当。在最简单的形式中,您可以使用它来测试变量是否已定义,而不是空的,也不是假的:
1 |
|
对于多个分支,可以像在 Python 中一样使用 elif 和 else。您也可以在那里使用更复杂的表达式 :
1 |
|
include
导入其他模板
1 |
|
extends
继承母版
1 |
|
你可以创建一个base.html作为基模板,把导航栏、页脚、flash消息、js或css文件等等需要在每一个页面中显示的内容放在基模板里,并添加一个空的块用来放置其他子模板的内容:
1 |
|
然后在其他的模板(子模板)里使用这个extends语句继承它,并放置相应的内容到基模板里定义过的空块:
1 |
|
如果想添加内容到在父模板内已经定义的块,可以使用super函数:
1 |
|
这样可以避免覆盖父块的内容。
Whitespace Control(空格控制)
默认的设置:
- 如果末尾有换行符,则去除;
- 其他空格原样保留。
也就是说,下面这几行:
1 |
|
渲染后的结果是这样:
1 |
|
Jinja2语句占据的空行,你自己输出的空格,Tab都将保留。
如果要去掉Jinja2语句占据的空行,可以通过设置Jinja2的环境变量实现:
1 |
|
或者像这样手动添加一个减号(注意和%之间没有空格):
1 |
|
两者实现的效果相同,如下:
1 |
|
如果语句块的前后都加上减号:
1 |
|
渲染后会是这样:
1 |
|
通过Jinja2提供的环境变量,你可以设置很多东西,比如分隔符(在和其他的语言产生冲突时,可以通过修改分隔符来解决)。具体见:http://jinja.pocoo.org/docs/dev/api/#jinja2.Environment
参考资料
- https://docs.jinkan.org/docs/jinja2/
- https://wsgzao.github.io/post/jinja/
- https://blog.csdn.net/qq_40671063/article/details/137842594
- https://zhuanlan.zhihu.com/p/23669244
文章链接:
https://www.zywvvd.com/notes/coding/doc/jinja2/jinja2/
“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信支付

支付宝支付