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

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

{% import *module* %}

和 Python 一样 import 语句。

{% include *filename* %}

包括另一个模板文件。包含的文件可以看到所有局部变量,就好像它被直接复制到 include 指令(指令) {{% autoescape %}} 指令是一个例外)。交替地, {{% module Template(filename, **kwargs) %}} 可以用于包含具有独立命名空间的另一个模板。

{% module *expr* %}

呈现出一个 UIModule . 的输出 UIModule 未转义::

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

已编译的模板。

我们从给定的模板字符串编译成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: Any) bytes[源代码]

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

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) -- 要添加到默认模板命名空间的字典,或 None .

  • whitespace (str) -- 指定模板中空白的默认行为的字符串;请参见 filter_whitespace 供选择。对于以“.html”和“.js”结尾的文件,默认值为“single”;对于其他文件,默认值为“all”。

在 4.3 版更改: 补充 whitespace 参数。

reset() None[源代码]

重置已编译模板的缓存。

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

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

load(name: str, parent_path: Optional[str] = None) tornado.template.Template[源代码]

加载模板。

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

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

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

从字典加载的模板加载程序。

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

为模板语法错误引发。

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

在 4.3 版更改: 补充 filenamelineno 属性。

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

转换空白 text 根据 mode .

可用模式包括:

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

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

  • oneline :将所有运行的空白折叠为一个空格字符,删除进程中的所有换行符。

4.3 新版功能.