Skip to main content

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 实例,而是使用 tornado.web.RequestHandlerrenderrender_string 方法,根据 template_path Application 设置自动加载模板。

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

语法参考

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

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

如果您需要在输出中包括字面的 {{{%,或 {#,这些标签可以被转义为 {{!{%!{#!

{% 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)[源代码]

编译模板。

我们从给定的template_string编译成Python。您可以使用generate()从变量生成模板。

构造模板。

参数:
  • 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)[源代码]

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

class tornado.template.BaseLoader(autoescape='xhtml_escape', namespace=None, whitespace=None)[源代码]

模板加载程序的基类。

您必须使用模板加载器来使用模板构造,如 {% extends %}{% include %}。加载器在第一次加载后缓存所有模板。

构造模板加载器。

参数:
  • autoescape (str) – 模板命名空间中的函数名称,例如“xhtml_escape”或默认情况下禁用自动转义的 None
  • namespace (dict) – 要添加到默认模板命名空间或 None 的字典。
  • whitespace (str) – 指定模板中空格的默认行为的字符串;请参阅 filter_whitespace 了解选项。对于以“.html”和“.js”结尾的文件,默认值为“single”,对于其他文件则为“all”。

在 4.3 版更改: 添加了 whitespace 参数。

load(name, parent_path=None)[源代码]

加载模板。

reset()[源代码]

重置已编译模板的缓存。

resolve_path(name, parent_path=None)[源代码]

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

class tornado.template.Loader(root_directory, **kwargs)[源代码]

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

class tornado.template.DictLoader(dict, **kwargs)[源代码]

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

exception tornado.template.ParseError(message, filename=None, lineno=0)[源代码]

引发模板语法错误。

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

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

tornado.template.filter_whitespace(mode, text)[源代码]

根据 mode 转换 text 中的空格。

可用模式有:

  • all:返回所有未修改的空格。

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

  • oneline:将所有空格的空格折叠到单个空格字符中,删除该过程中的所有换行符。

4.3 新版功能.