这份文档描述了模板引擎中的语法和语义结构,对于创建 Jinja 模板是一份相当有用 的参考。因为模板引擎非常灵活,应用中的配置会在分隔符和未定义值的行为方面与 这里的配置有细微差异。
概要
模板仅仅是文本文件。它可以生成任何基于文本的格式(HTML、XML、CSV、LaTex 等等)。 它并没有特定的扩展名, .html
或 .xml
都是可以的。
模板包含 变量 或 表达式 ,这两者在模板求值的时候会被替换为值。模板中 还有标签,控制模板的逻辑。模板语法的大量灵感来自于 Django 和 Python 。
下面是一个最小的模板,它阐明了一些基础。我们会在文档中后面的部分解释细节:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<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 }}
</body>
</html>
这包含了默认的设定。应用开发者也会把语法从 {% foo %}
改成 <% foo %>
或类似的东西。
这里有两种分隔符: {% ... %}
和 {{ ... }}
。前者用于执行诸如 for 循环 或赋值的语句,后者把表达式的结果打印到模板上。
变量
应用把变量传递到模板,你可能在模板中弄混。变量上面也可以有你能访问的属性或元 素。变量看起来是什么,完全取决于应用提供了什么。
你可以使用点( .
)来访问变量的属性,作为替代,也可以使用所谓的“下标”语 法( []
)。下面的几行效果是一样的:
{{ foo.bar }}
{{ foo['bar'] }}
知晓花括号 不是 变量的一部分,而是打印语句的一部分是重要的。如果你访问标签 里的不带括号的变量。
如果变量或属性不存在,会返回一个未定义值。你可以对这类值做什么取决于应用的配 置,默认的行为是它如果被打印,其求值为一个空字符串,并且你可以迭代它,但其它 操作会失败。
实现
为方便起见,Jinja2 中 foo.bar
在 Python 层中做下面的事情:
- 检查 foo 上是否有一个名为 bar 的属性。
- 如果没有,检查 foo 中是否有一个
'bar'
项 。 - 如果没有,返回一个未定义对象。
foo['bar']
的方式相反,只在顺序上有细小差异:
- 检查在 foo 中是否有一个
'bar'
项。 - 如果没有,检查 foo 上是否有一个名为 bar 的属性。
- 如果没有,返回一个未定义对象。
如果一个对象有同名的项和属性,这很重要。此外,有一个 attr()
过滤 器,它只查找属性。