版权声明
本文出自 “ 幻冥极地 ” 博客 ,作者 小貘 采用 署名-非商业性使用-相同方式共享 协议。转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。
https://www.moorehy.com/archives/191
本文档描述了Jinja2模板引擎的语法以及语义,有助于Jinja模板创建者作为参考文档查阅使用。作为模板引擎来说,Jinja非常灵活,故这里展示的代码可能由于您应用配置的细微不同而最终效果不同,这些不同可能来自于 分隔符(delimiters) 或 未定义值(undefined values) 的行为。
摘要
Jinja模板是一个简单的纯文本文件。Jinja可以生成任何基于文本格式的文件,如:HTML,XML,CSV,LaTex等。Jinja模板不需要有特定的扩展名,如 .html , .xml 或任何其他扩展名皆可。
一个模板文件包含 变量 (variables) 和/或 表达式 (expressions),他们将在模板文件被渲染时替换为值。Jinja模板语法受启发于 Django 和 Python 。
下面是一个最简单的模板,使用默认的Jinja配置,来阐明一些基本要素。稍后将在本文档的中进行详细说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<!DOCTYPE html> <html lang="en"> <head> <title>My Webpage</title> </head> <body> <ul id="navigation"> {% for item in navigation %} <li><a href="{{ item.href }}">{{ item.caption }}</a></li> {% endfor %} </ul> <h1>My Webpage</h1> {{ a_variable }} {# a comment #} </body> </html> |
下面的例子将展示默认配置设置。开发者可以将语法配置从 {% foo %} 修改为 <% foo %> ,或者其他类似的语法规则。
存在很多各种各样的分隔符。Jinja默认的分隔符配置如下:
- {% ... %} 用于语句 ( Statements )
- {{ ... }} 用于打印模板输出的表达式 ( Expressions )
- {# ... #} 用于不包含在模板输出中的注释 ( Comments )
- # ... ## 用于行语句 ( Line Statements )
变量 (Variables)
模板变量是通过上下文字典传入模板从而被定义的。
您可以所以改变应用传入到模板中的变量。您也可以访问变量中可能存在的属性或元素。变量的属性很大程度上取决于提供变量的应用。
除了标准的Python __getitem__ “下标”语法( [] )外,您还可以使用一个( . )来访问变量的属性。
下面两行功能相同:
1 2 |
{{ foo.bar }} {{ foo['bar'] }} |
重要的是要知道外部的双大括号( {{}} )不是变量的一部分,而是打印语句的。如果您要访问标签内的变量,不用带上外面的大括号。
如果一个变量或属性不存在,您讲得到一个未定义的值( undefined object )。您可以用这种值做什么取决于应用配置:如果被打印或迭代,默认的操作是将其输出为一个空字串,并且对其的所有其他操作都会失败。
实现
为了方便, Jinja2中的 foo.bar 在Python层做了如下操作:
- 检查 foo 中被称为 bar 的属性 ( getattr(foo, 'bar') )
- 如果没有,检查 foo 中的 'bar' 条目 ( foo.__getitem__('bar') )
- 如果没有,返回一个未定义对象( undefined object )
foo['bar'] 的实现大体相同,但在判断顺序上有一点差异:
- 检查 foo 中的 'bar' 条目 ( foo.__getitem__('bar') )
- 如果没有,检查 foo 中被称为 bar 的属性 ( getattr(foo, 'bar') )
- 如果没有,返回一个未定义对象( undefined object )
如果对象拥有同名的条目和属性,那上述的操作执行顺序就非常重要了。另外, attr() 过滤器仅查找属性。
[…] 订阅注意 […]
[…] 变量 […]