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 %}

与大多数其他模板系统不同,我们不会对您可以在语句中包含的表达式有任何限制。 iffor 块被精确地翻译成 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()

典型的应用程序不会手动创建 TemplateLoader 实例,而是使用 renderrender_string 方法 tornado.web.RequestHandler,它会根据 template_path Application 设置自动加载模板。

_tt_ 开头的变量名由模板系统保留,应用程序代码不应使用。

语法参考

模板表达式用双大括号包围: {{ ... }}。内容可以是任何 python 表达式,它将根据当前的自动转义设置进行转义并插入到输出中。其他模板指令使用 {% %}

要注释掉一个部分以便它从输出中省略,请用 {# ... #} 将其包围。

要在输出中包含字面量 {{{%{#,请将它们分别转义为 {{!{%!{#!

{% apply *function* %}...{% end %}

将函数应用于 applyend 之间所有模板代码的输出

{% apply linkify %}{{name}} said: {{message}}{% end %}

请注意,作为实现细节,应用块是作为嵌套函数实现的,因此它们可能与通过 {% set %} 设置的变量或在循环中使用 {% break %}{% continue %} 奇妙地交互。

{% autoescape *function* %}

设置当前文件的自动转义模式。这不会影响其他文件,即使是那些被 {% include %} 引用的文件。请注意,自动转义也可以在全局范围内配置,在 ApplicationLoader 中。

{% 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 %}

条件语句 - 输出条件为真的第一个部分。(elifelse 部分是可选的)

{% import *module* %}

与 python import 语句相同。

{% include *filename* %}

包含另一个模板文件。包含的文件可以像直接复制到 include 指令位置一样看到所有局部变量({% autoescape %} 指令是一个例外)。或者,可以使用 {% module Template(filename, **kwargs) %} 包含另一个具有隔离命名空间的模板。

{% module *expr* %}

呈现 UIModuleUIModule 的输出不会转义

{% module Template("foo.html", arg=42) %}

UIModulestornado.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

generate(**kwargs: Any) bytes[source]

使用给定的参数生成此模板。

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 参数。

reset() None[source]

重置已编译模板的缓存。

resolve_path(name: str, parent_path: Optional[str] = None) str[source]

将可能相对的路径转换为绝对路径(在内部使用)。

load(name: str, parent_path: Optional[str] = None) Template[source]

加载模板。

class tornado.template.Loader(root_directory: str, **kwargs: Any)[source]

从单个根目录加载模板的模板加载器。

class tornado.template.DictLoader(dict: Dict[str, str], **kwargs: Any)[source]

从字典加载模板的模板加载器。

exception tornado.template.ParseError(message: str, filename: Optional[str] = None, lineno: int = 0)[source]

针对模板语法错误引发。

ParseError 实例具有 filenamelineno 属性,指示错误的位置。

在版本 4.3 中更改: 添加了 filenamelineno 属性。

tornado.template.filter_whitespace(mode: str, text: str) str[source]

根据 mode 转换 text 中的空白。

可用的模式为

  • all: 无修改地返回所有空白。

  • single: 使用单个空格字符折叠连续的空白,保留换行符。

  • oneline: 将所有空白运行折叠成单个空格字符,在此过程中删除所有换行符。

版本 4.3 中新增。