多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### 模板 你可以在 Tornado 中使用任何一种 Python 支持的模板语言。但是相较于其它模板而言, Tornado 自带的模板系统速度更快,并且也更灵活。具体可以查看 [`template`](http://github.com/facebook/tornado/blob/master/tornado/template.py) 模块的源码。 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) &gt; 2 %}`。表达语句是使用 `{{` 和 `}}` 包起来的,例如 `{{ items[0] }}`。 控制语句和对应的 Python 语句的格式基本完全相同。我们支持 `if`、`for`、`while` 和 `try`,这些语句逻辑结束的位置需要用 `{% end %}` 做标记。我们还通过 `extends` 和 `block` 语句实现了模板继承。这些在 [`template` 模块](http://github.com/facebook/tornado/blob/master/tornado/template.py) 的代码文档中有着详细的描述。 表达语句可以是包括函数调用在内的任何 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`: for `handler.static_url` 的別名 * `xsrf_form_html`: `handler.xsrf_form_html` 的別名 * `reverse_url`: `Application.reverse_url` 的別名 * `Application` 设置中 `ui_methods` 和 `ui_modules` 下面的所有项目 * 任何传递给 `render` 或者 `render_string` 的关键字参数 当你制作一个实际应用时,你会需要用到 Tornado 模板的所有功能,尤其是 模板继承功能。所有这些功能都可以在 [`template` 模块](http://github.com/facebook/tornado/blob/master/tornado/template.py) 的代码文档中了解到。(其中一些功能是在 `web` 模块中实现的,例如 `UIModules`) 从实现方式来讲,Tornado 的模板会被直接转成 Python 代码。模板中的语句会逐字复制到一个 代表模板的函数中去。我们不会对模板有任何限制,Tornado 模板模块的设计宗旨就是要比 其他模板系统更灵活而且限制更少。所以,当你的模板语句里发生了随机的错误,在执行模板时 你就会看到随机的 Python 错误信息。 所有的模板输出都已经通过 `tornado.escape.xhtml_escape` 自动转义(escape),这种默认行为, 可以通过以下几种方式修改:将 `autoescape=None` 传递给 `Application` 或者 `TemplateLoader`、 在模板文件中加入 `{% autoescape None %}`、或者在简单表达语句 `{{ ... }}` 写成 `{% raw ...%}`。另外你可以在上述位置将 `autoescape` 设为一个自定义函数,而不仅仅是 `None`。