tornado.template — Flexible output generation

一个简单的模板系统,可将模板编译为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_开头的变量名由模板系统保留,不应由应用程序代码使用.

Syntax Reference

模板表达式用双花括号{{ ... }}包围. 内容可以是任何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 %}

条件语句-输出条件为true的第一部分. ( 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方法)的功能,当模板系统在其他上下文中tornado.web.RequestHandler使用时将不起作用.

{% raw *expr* %}

输出给定表达式的结果而不会自动转义.

{% set *x* = *y* %}

设置局部变量.

{% try %}...{% except %}...{% else %}...{% finally %}...{% end %}

与python try语句相同.

{% while *condition* %}... {% end %}

与python while语句相同. {% break %}{% continue %}可以在循环内使用.

{% whitespace *mode* %}

Sets the whitespace mode for the remainder of the current file (or until the next {% whitespace %} directive). See filter_whitespace for available options. New in Tornado 4.3.

Class reference

class tornado.template.Template(template_string, name="<string>", loader=None, compress_whitespace=None, autoescape="xhtml_escape", whitespace=None)[source]

编译后的模板.

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

构造模板.

Parameters
  • template_stringstr )–模板文件的内容.

  • namestr )–从中加载模板的文件名(用于错误消息).

  • 加载程序tornado.template.BaseLoader ) -的BaseLoader负责该模板中,用于解决{% include %}{% extend %}指令.

  • compress_whitespacebool )–从Tornado 4.3开始不推荐使用. 如果为true,则等同于whitespace="single"如果为false,则等同于whitespace="single" whitespace="all" .

  • autoescapestr )–模板名称空间中的函数名称,或者默认为None以禁用转义.

  • 空格str )–指定空格处理的字符串; 有关选项,请参见filter_whitespace .

在版本4.3中更改:添加了whitespace参数; 不推荐使用compress_whitespace .

generate(**kwargs) → bytes[source]

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

class tornado.template.BaseLoader(autoescape: str = 'xhtml_escape', namespace: Dict[str, Any] = None, whitespace: str = None)[source]

模板加载器的基类.

您必须使用模板加载器来使用模板结构,例如{% extends %}{% include %} . 首次加载后,加载程序会缓存所有模板.

构造一个模板加载器.

Parameters
  • autoescape (str) – The name of a function in the template namespace, such as “xhtml_escape”, or None to disable autoescaping by default.

  • 名称空间dict )–要添加到默认模板名称空间的字典,即None .

  • 空格str )–一个字符串,指定模板中空格的默认行为; 有关选项,请参见filter_whitespace . 对于以" .html"和" .js"结尾的文件,默认值为"单个",对于其他文件,默认值为"全部".

在版本4.3中更改: Added whitespace parameter.

reset() → None[source]

重置已编译模板的缓存.

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

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

load(name: str, parent_path: str = None) → tornado.template.Template[source]

加载模板.

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

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

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

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

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

因模板语法错误而提出.

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

在版本4.3中更改: Added filename and lineno attributes.

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

根据mode转换text空白.

可用的模式有:

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

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

  • oneline :将所有空白行合并为一个空格字符,从而删除该过程中的所有换行符.

版本4.3中的新功能.