模板
你可以在 Tornado 中使用任何一种 Python 支持的模板语言。但是相较于其它模板而言, Tornado 自带的模板系统速度更快,并且也更灵活。具体可以查看 template 模块的源码。
Tornado 模板其实就是 HTML 文件(也可以是任何文本格式的文件),其中包含了 Python 控制结构和表达式,这些控制结构和表达式需要放在规定的格式标记符(markup)中:
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<ul>
{% for item in items %}
<li>{{ escape(item) }}</li>
{% end %}
</ul>
</body>
</html>
如果你把上面的代码命名为 "template.html",保存在 Python 代码的同一目录中,你就可以 这样来渲染它:
class MainHandler(tornado.web.RequestHandler):
def get(self):
items = ["Item 1", "Item 2", "Item 3"]
self.render("template.html", title="My title", items=items)
Tornado 的模板支持“控制语句”和“表达语句”,控制语句是使用 {% 和 %} 包起来的 例如 {% if len(items) > 2 %}。表达语句是使用 {{ 和 }} 包起来的,例如 {{ items[0] }}。
控制语句和对应的 Python 语句的格式基本完全相同。我们支持 if、for、while 和 try,这些语句逻辑结束的位置需要用 {% end %} 做标记。我们还通过 extends 和 block 语句实现了模板继承。这些在 template 模块 的代码文档中有着详细的描述。
表达语句可以是包括函数调用在内的任何 Python 表述。模板中的相关代码,会在一个单独 的名字空间中被执行,这个名字空间包括了以下的一些对象和方法。(注意,下面列表中 的对象或方法在使用 RequestHandler.render 或者 render_string 时才存在的 ,如果你在 RequestHandler 外面直接使用 template 模块,则它们中的大部分是不存在的)。
escape:tornado.escape.xhtml_escape的別名xhtml_escape:tornado.escape.xhtml_escape的別名url_escape:tornado.escape.url_escape的別名json_encode:tornado.escape.json_encode的別名squeeze:tornado.escape.squeeze的別名linkify:tornado.escape.linkify的別名datetime: Python 的datetime模组handler: 当前的RequestHandler对象request:handler.request的別名current_user:handler.current_user的別名locale:handler.locale的別名_:handler.locale.translate的別名static_url: forhandler.static_url的別名xsrf_form_html:handler.xsrf_form_html的別名reverse_url:Application.reverse_url的別名Application设置中ui_methods和ui_modules下面的所有项目- 任何传递给
render或者render_string的关键字参数
当你制作一个实际应用时,你会需要用到 Tornado 模板的所有功能,尤其是 模板继承功能。所有这些功能都可以在 template 模块 的代码文档中了解到。(其中一些功能是在 web 模块中实现的,例如 UIModules)
从实现方式来讲,Tornado 的模板会被直接转成 Python 代码。模板中的语句会逐字复制到一个 代表模板的函数中去。我们不会对模板有任何限制,Tornado 模板模块的设计宗旨就是要比 其他模板系统更灵活而且限制更少。所以,当你的模板语句里发生了随机的错误,在执行模板时 你就会看到随机的 Python 错误信息。
所有的模板输出都已经通过 tornado.escape.xhtml_escape 自动转义(escape),这种默认行为, 可以通过以下几种方式修改:将 autoescape=None 传递给 Application 或者 TemplateLoader、 在模板文件中加入 {% autoescape None %}、或者在简单表达语句 {{ ... }} 写成 {% raw ...%}。另外你可以在上述位置将 autoescape 设为一个自定义函数,而不仅仅是 None。