[Flask][01]Jinja2模板设计文档——基础知识

版权声明

本文出自 “ 幻冥极地 ” 博客 ,作者 小貘 采用 署名-非商业性使用-相同方式共享 协议。转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。
https://www.moorehy.com/archives/191

本文档描述了Jinja2模板引擎的语法以及语义,有助于Jinja模板创建者作为参考文档查阅使用。作为模板引擎来说,Jinja非常灵活,故这里展示的代码可能由于您应用配置的细微不同而最终效果不同,这些不同可能来自于 分隔符(delimiters)未定义值(undefined values) 的行为。

摘要

Jinja模板是一个简单的纯文本文件。Jinja可以生成任何基于文本格式的文件,如:HTML,XML,CSV,LaTex等。Jinja模板不需要有特定的扩展名,如 .html.xml 或任何其他扩展名皆可。

一个模板文件包含 变量 (variables) 和/或 表达式 (expressions),他们将在模板文件被渲染时替换为值。Jinja模板语法受启发于 DjangoPython

下面是一个最简单的模板,使用默认的Jinja配置,来阐明一些基本要素。稍后将在本文档的中进行详细说明:

下面的例子将展示默认配置设置。开发者可以将语法配置从 {% foo %} 修改为 <% foo %> ,或者其他类似的语法规则。

存在很多各种各样的分隔符。Jinja默认的分隔符配置如下:

变量 (Variables)

模板变量是通过上下文字典传入模板从而被定义的。

您可以所以改变应用传入到模板中的变量。您也可以访问变量中可能存在的属性或元素。变量的属性很大程度上取决于提供变量的应用。

除了标准的Python __getitem__ “下标”语法( [] )外,您还可以使用一个( . )来访问变量的属性。

下面两行功能相同:

重要的是要知道外部的双大括号( {{}} )不是变量的一部分,而是打印语句的。如果您要访问标签内的变量,不用带上外面的大括号。

如果一个变量或属性不存在,您讲得到一个未定义的值( 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() 过滤器仅查找属性。

2 thoughts on “[Flask][01]Jinja2模板设计文档——基础知识

发表评论

电子邮件地址不会被公开。 必填项已用*标注