tornado.template
— 灵活的输出生成¶
一个将模板编译成 Python 代码的简单模板系统。
基本用法如下
t = template.Template("<html>{{ myvalue }}</html>")
print(t.generate(myvalue="XXX"))
Loader
是一个从根目录加载模板并缓存已编译模板的类
loader = template.Loader("/home/btaylor")
print(loader.load("test.html").generate(myvalue="XXX"))
我们将所有模板编译成原始 Python 代码。错误报告目前……嗯,很有趣。模板的语法
### base.html
<html>
<head>
<title>{% block title %}Default title{% end %}</title>
</head>
<body>
<ul>
{% for student in students %}
{% block student %}
<li>{{ escape(student.name) }}</li>
{% end %}
{% end %}
</ul>
</body>
</html>
### bold.html
{% extends "base.html" %}
{% block title %}A bolder title{% end %}
{% block student %}
<li><span style="bold">{{ escape(student.name) }}</span></li>
{% end %}
与大多数其他模板系统不同,我们不会对您可以在语句中包含的表达式有任何限制。 if
和 for
块被精确地翻译成 Python 代码,因此您可以执行诸如以下复杂表达式之类的事情
{% for student in [p for p in people if p.student and p.age > 23] %}
<li>{{ escape(student.name) }}</li>
{% end %}
直接翻译成 Python 代码意味着您可以轻松地将函数应用于表达式,例如上面的示例中的 escape()
函数。您可以将函数传递到模板中,就像任何其他变量一样(在 RequestHandler
中,覆盖 RequestHandler.get_template_namespace
)
### Python code
def add(x, y):
return x + y
template.execute(add=add)
### The template
{{ add(1, 2) }}
默认情况下,我们为所有模板提供函数 escape()
、url_escape()
、json_encode()
和 squeeze()
。
典型的应用程序不会手动创建 Template
或 Loader
实例,而是使用 render
和 render_string
方法 tornado.web.RequestHandler
,它会根据 template_path
Application
设置自动加载模板。
以 _tt_
开头的变量名由模板系统保留,应用程序代码不应使用。
语法参考¶
模板表达式用双大括号包围: {{ ... }}
。内容可以是任何 python 表达式,它将根据当前的自动转义设置进行转义并插入到输出中。其他模板指令使用 {% %}
。
要注释掉一个部分以便它从输出中省略,请用 {# ... #}
将其包围。
要在输出中包含字面量 {{
、{%
或 {#
,请将它们分别转义为 {{!
、{%!
和 {#!
。
{% apply *function* %}...{% end %}
将函数应用于
apply
和end
之间所有模板代码的输出{% apply linkify %}{{name}} said: {{message}}{% end %}
请注意,作为实现细节,应用块是作为嵌套函数实现的,因此它们可能与通过
{% set %}
设置的变量或在循环中使用{% break %}
或{% continue %}
奇妙地交互。{% autoescape *function* %}
设置当前文件的自动转义模式。这不会影响其他文件,即使是那些被
{% include %}
引用的文件。请注意,自动转义也可以在全局范围内配置,在Application
或Loader
中。{% autoescape xhtml_escape %} {% autoescape None %}
{% block *name* %}...{% end %}
指示一个命名的可替换块,用于
{% extends %}
。父模板中的块将被子模板中同名块的内容替换。<!-- base.html --> <title>{% block title %}Default title{% end %}</title> <!-- mypage.html --> {% extends "base.html" %} {% block title %}My page title{% end %}
{% comment ... %}
将从模板输出中删除的注释。请注意,没有
{% end %}
标签;注释从单词comment
到结束的%}
标签。{% extends *filename* %}
从另一个模板继承。使用
extends
的模板应包含一个或多个block
标签来替换父模板中的内容。子模板中未包含在block
标签中的任何内容都将被忽略。有关示例,请参阅{% block %}
标签。{% for *var* in *expr* %}...{% end %}
与 python
for
语句相同。{% break %}
和{% continue %}
可以用于循环内部。{% from *x* import *y* %}
与 python
import
语句相同。{% if *condition* %}...{% elif *condition* %}...{% else %}...{% end %}
条件语句 - 输出条件为真的第一个部分。(
elif
和else
部分是可选的){% import *module* %}
与 python
import
语句相同。{% include *filename* %}
包含另一个模板文件。包含的文件可以像直接复制到
include
指令位置一样看到所有局部变量({% autoescape %}
指令是一个例外)。或者,可以使用{% module Template(filename, **kwargs) %}
包含另一个具有隔离命名空间的模板。{% module *expr* %}
呈现
UIModule
。UIModule
的输出不会转义{% module Template("foo.html", arg=42) %}
UIModules
是tornado.web.RequestHandler
类(特别是它的render
方法)的功能,当模板系统在其他上下文中独立使用时将无法工作。{% raw *expr* %}
输出给定表达式的结果,不进行自动转义。
{% set *x* = *y* %}
设置一个局部变量。
{% try %}...{% except %}...{% else %}...{% finally %}...{% end %}
与 python
try
语句相同。{% while *condition* %}... {% end %}
与 python
while
语句相同。{% break %}
和{% continue %}
可以用于循环内部。{% whitespace *mode* %}
设置当前文件剩余部分的空白模式(或直到下一个
{% whitespace %}
指令)。有关可用选项,请参见filter_whitespace
。Tornado 4.3 中的新增功能。
类参考¶
- class tornado.template.Template(template_string, name='<string>', loader=None, compress_whitespace=None, autoescape='xhtml_escape', whitespace=None)[source]¶
已编译的模板。
我们从给定的 template_string 编译成 Python。您可以使用 generate() 从变量生成模板。
构造一个 Template。
- 参数
template_string (str) – 模板文件的内容。
name (str) – 加载模板的文件名(用于错误消息)。
loader (tornado.template.BaseLoader) – 负责此模板的
BaseLoader
,用于解析{% include %}
和{% extend %}
指令。compress_whitespace (bool) – 自 Tornado 4.3 起已弃用。如果为真,等效于
whitespace="single"
,如果为假,等效于whitespace="all"
。autoescape (str) – 模板命名空间中的函数名称,或
None
以默认情况下禁用转义。whitespace (str) – 指定空白处理方式的字符串;有关选项,请参见
filter_whitespace
。
版本 4.3 中的更改: 添加了
whitespace
参数;已弃用compress_whitespace
。
- class tornado.template.BaseLoader(autoescape: str = 'xhtml_escape', namespace: Optional[Dict[str, Any]] = None, whitespace: Optional[str] = None)[source]¶
模板加载器的基类。
您必须使用模板加载器才能使用模板结构,例如
{% extends %}
和{% include %}
。加载器在首次加载所有模板后缓存它们。构造一个模板加载器。
- 参数
autoescape (str) – 模板命名空间中的函数名称,例如“xhtml_escape”,或
None
以默认情况下禁用自动转义。namespace (dict) – 要添加到默认模板命名空间的字典,或
None
。whitespace (str) – 指定模板中空白的默认行为的字符串;有关选项,请参见
filter_whitespace
。默认情况下,对于以“.html”和“.js”结尾的文件为“single”,对于其他文件为“all”。
版本 4.3 中的更改: 添加了
whitespace
参数。