Tornado 灵活的输出生成
一个简单的模板系统,将模板编译成 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 实例,而是使用 tornado.web.RequestHandler 的 render
和 render_string
方法,它们会根据 template_path 应用程序设置自动加载模板。
以_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* %}
从另一个模板继承。 使用扩展的模板应该包含一个或多个块标签来替换父模板的内容。 子模板中未包含在块标记中的任何内容都将被忽略。 例如,请参阅 {% block %}
标签。
{% for *var* in *expr* %}...{% end %}
与python for 语句相同。 {% break %}
和 {% continue %}
可以在循环内使用。
{% from *x* import *y* %}
与 python 导入语句相同。
{% if *condition* %}...{% elif *condition* %}...{% else %}...{% end %}
条件语句 - 输出条件为真的第一部分。(elif
和 else
部分是可选的)
{% import *module* %}
与 python 导入语句相同。
{% include *filename* %}
包括另一个模板文件。 被包含的文件可以看到所有的局部变量,就好像它被直接复制到了包含指令的位置({% autoescape %}
指令是一个例外)。 或者,{% module Template(filename, **kwargs) %}
可用于包含另一个具有单独命名空间的模板。
{% module *expr* %}
渲染一个 UIModule。 UIModule 的输出不会被转义:
{% module Template("foo.html", arg=42) %}
UIModules
是tornado.web.RequestHandler
类(特别是它的渲染方法)的一个特性,当模板系统在其他上下文中单独使用时将不起作用。
{% raw *expr* %}
输出给定表达式的结果而不自动转义。
{% set *x* = *y* %}
设置一个局部变量。
{% try %}...{% except %}...{% else %}...{% finally %}...{% end %}
与 python try 语句相同。
{% while *condition* %}... {% end %}
与 python while 语句相同。 {% break %}
和 {% continue %}
可以在循环内使用。
{% whitespace *mode* %}
为当前文件的其余部分设置空白模式(或直到下一个 {% whitespace %}
指令)。
类参考
class tornado.template.Template(template_string, name="<string>", loader=None, compress_whitespace=None, autoescape="xhtml_escape", whitespace=None)
我们从给定的 template_string 编译成 Python。 您可以使用 generate() 从变量中生成模板。
参数:
template_string
(str) - 模板文件的内容。
name
(str) -- 加载模板的文件名(用于错误消息)。
loader
(tornado.template.BaseLoader) -- 负责此模板的 BaseLoader,用于解析 {% include %} 和 {% extend %} 指令。
compress_whitespace
(bool) – 自 Tornado 4.3 起已弃用。 如果为 true,则等效于 whitespace="single",如果为 false,则等效于 whitespace="all"。
autoescape
(str) -- 模板命名空间中的函数名称,或 None 默认禁用转义。
whitespace
(str) -- 指定空格处理的字符串
在 4.3 版更改: 添加whitespace
参数; 不推荐使用 compress_whitespace
。
class tornado.template.BaseLoader(autoescape: str = 'xhtml_escape', namespace: Optional[Dict[str, Any]] = None, whitespace: Optional[str] = None)
您必须使用模板加载器才能使用 {% extends %} 和 {% include %} 等模板结构。 加载器在第一次加载后缓存所有模板。
参数:
-
autoescape
(str) – 模板命名空间中的函数名称,例如“xhtml_escape”,或 None 默认禁用自动转义。 -
namespace
(dict) -- 要添加到默认模板命名空间的字典,或无。 -
whitespace
(str) -- 一个字符串,指定模板中空格的默认行为。以“.html”和“.js”结尾的文件默认为“single”,其他文件默认为“all”。
在 4.3 版更改: 添加了whitespace
参数。
class tornado.template.Loader(root_directory: str, **kwargs)
从单个根目录加载的模板加载器
class tornado.template.DictLoader(dict: Dict[str, str], **kwargs)
从字典加载的模板加载器
exception tornado.template.ParseError(message: str, filename: Optional[str] = None, lineno: int = 0)
针对模板语法错误引发。
ParseError
实例具有指示错误位置的 filename
和 lineno
属性。
tornado.template.filter_whitespace(mode: str, text: str) → str
根据模式转换文本中的空格。
可用模式有:
-
all
:返回所有未修改的空格。 -
single
:用单个空格字符折叠连续的空格,保留换行符。 -
oneline
:将所有运行的空格折叠成一个空格字符,删除进程中的所有换行符。