[Flask][08]Jinja2模板设计文档——结构控制语句、导入上下文行为

版权声明

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

结构控制语句 (List of Control Structures)

Block Assignments

该语句于2.8版本中引入

从 Jinja 2.8 开始,可以使用赋值块来将一个代码块的内容赋值到一个变量中。这在某些情况下,可以作为宏的替代使用。在这种情况下,不是使用等号和值,而是仅仅使用变量名,然后直到 {% endset %} 的内容将被赋值给该变量。

例子:

然后 navigation 变量将包含导航 HTML 的源码。

Extends

extends 标签可以用于从另一个模板扩展一个模板。一个文件中可以有多个 extends 标签,但是一次只能执行一个。

参见上面关于 模板继承 (Template Inheritance)的部分。

Blocks

块(Blocks)用于继承,并同时作为占位符(placeholders)和替换(replacements)。在 模板继承 (Template Inheritance)章节中有详细介绍。

Include

include 语句可用于包含模板,并将该文件的渲染内容返回到当前命名空间:

默认情况下, include 的模板可以访问现有上下文中的变量。有关导入(imports)和包含(includes)的上下文行为的更多详细信息,请参阅 导入上下文行为 (Import Context Behavior)。

从 Jinja 2.2 起,您可以使用 ignore missing 来标记一个 include ;在这种情况下,如果要 include 的模板不存在, Jinja 将忽略该语句。当与 withwithout context 相结合时,它必须放在上下文可见性语句之 。下面是一些合法的用例:

该语句于2.2版本中引入

您还可以提供在包含前检查其存在性的模板列表。第一个存在的模板将被 include 。在列表中的模板均不存在的情况下,如果提供了 ignore missing 语句,将返回一个空渲染,否则将抛出异常。

例子:

2.4版本中变更 : 如果一个模板对象被传入到模板上下文中,您可以使用 include 包含这个对象。

Import

Jinja2 支持将常用代码放入宏中。这些宏可以放在不同的模板,并从那里被导入。这类似于 Python 中的 import 语句。了解导入是被缓存的,并且默认情况下导入的模板只能访问全局变量,不能访问当前模板中的变量。有关导入和包含的上下文行为的更多详细信息,请参阅 导入上下文行为

有两种导入模板的方式。您可以将完整的模板导入到变量中,或从中请求特定的宏/导出的变量。

想象一下,我们有一个渲染表单(称为 forms.html )的辅助模块(module):

访问模板变量和宏的最简单和最灵活的方法是将整个模板模块导入到一个变量中。这样,您就可以访问这些属性了:

或者,您可以从模板中导入指定的名称到当前命名空间:

以一个或多个下划线开头的宏和变量是私有的,无法导入。

2.4版本中变更 : 如果一个模板对象被传入到模板上下文中,您可以使用 import 导入这个对象。

导入上下文行为 (Import Context Behavior)

默认情况下,包含(include)的模板被传递到当前上下文中,而导入(import)的模板不传递。这样做的原因是,与 include 不同, import 是被缓存的;因为导入通常用作保存宏的模块。

此行为可以显式地更改:通过添加 with contextwithout context 到 import/include 指令,当前的上下文被传入到模板中,并且缓存被自动禁用。

这里有两个例子:

注意

在 Jinja 2.0 中,传递给 include 模板的上下文不包含模板中定义的变量。事实上,这段代码无法实现我们的需求:

在 Jinja 2.0 中, include 的模板 render_box.html 无法 访问到 box 。从 Jinja 2.1 开始, render_box.html 就可以访问到了。

One thought on “[Flask][08]Jinja2模板设计文档——结构控制语句、导入上下文行为

发表评论

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