2.2 模板语法
既然我们已经看到了一个模板在实际应用中的简单例子,那么让我们深入地了解它们是如何工作的吧。Tornado 模板是被 Python 表达式和控制语句标记的简单文本文件。Tornado 的语法非常简单直接。熟悉 Django、Liquid 或其他相似框架的用户会发现它们非常相似,很容易学会。
在 2.1 节中,我们展示了如何在一个 Web 应用中使用 render 方法传送 HTML 给浏览器。你可以在 Tornado 应用之外使用 Python 解释器导入模板模块尝试模板系统,此时结果会被直接输出出来。
>>> from tornado.template import Template
>>> content = Template("<html><body><h1>{{ header }}</h1></body></html>")
>>> print content.generate(header="Welcome!")
<html><body><h1>Welcome!</h1></body></html>
2.2.1 填充表达式
在代码清单 2-1 中,我们演示了填充 Python 变量的值到模板的双大括号中的使用。实际上,你可以将任何 Python 表达式放在双大括号中。Tornado 将插入一个包含任何表达式计算结果值的字符串到输出中。下面是几个可能的例子:
>>> from tornado.template import Template
>>> print Template("{{ 1+1 }}").generate()
2
>>> print Template("{{ 'scrambled eggs'[-4:] }}").generate()
eggs
>>> print Template("{{ ', '.join([str(x*x) for x in range(10)]) }}").generate()
0, 1, 4, 9, 16, 25, 36, 49, 64, 81
2.2.2 控制流语句
你同样可以在 Tornado 模板中使用 Python 条件和循环语句。控制语句以{%和%}包围,并以类似下面的形式被使用:
{% if page is None %}
或
{% if len(entries) == 3 %}
控制语句的大部分就像对应的 Python 语句一样工作,支持 if、for、while 和 try。在这些情况下,语句块以{%开始,并以%}结束。
所以这个模板:
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<h1>{{ header }}</h1>
<ul>
{% for book in books %}
<li>{{ book }}</li>
{% end %}
</ul>
</body>
</html>
当被下面这个处理函数调用时:
class BookHandler(tornado.web.RequestHandler):
def get(self):
self.render(
"book.html",
title="Home Page",
header="Books that are great",
books=[
"Learning Python",
"Programming Collective Intelligence",
"Restful Web Services"
]
)
将会渲染得到下面的输出:
<html>
<head>
<title>Home Page</title>
</head>
<body>
<h1>Books that are great</h1>
<ul>
<li>Learning Python</li>
<li>Programming Collective Intelligence</li>
<li>Restful Web Services</li>
</ul>
</body>
</html>
不像许多其他的 Python 模板系统,Tornado 模板语言的一个最好的东西是在 if 和 for 语句块中可以使用的表达式没有限制。因此,你可以在你的模板中执行所有的 Python 代码。
同样,你也可以在你的控制语句块中间使用 {% set foo = 'bar' %}
来设置变量。你还有很多可以在控制语句块中做的事情,但是在大多数情况下,你最好使用 UI 模块来做更复杂的划分。我们稍后会更详细的看到这一点。
2.2.3 在模板中使用函数
Tornado 在所有模板中默认提供了一些便利的函数。它们包括:
escape(s)
替换字符串 s 中的&、为他们对应的 HTML 字符。
url_escape(s)
使用 urllib.quote_plus 替换字符串 s 中的字符为 URL 编码形式。
json_encode(val)
将 val 编码成 JSON 格式。(在系统底层,这是一个对 json 库的 dumps 函数的调用。查阅相关的文档以获得更多关于该函数接收和返回参数的信息。)
squeeze(s)
过滤字符串 s,把连续的多个空白字符替换成一个空格。
在 Tornado 1.x 中,模版不是被自动转义的。在 Tornado 2.0 中,模板被默认为自动转义(并且可以在 Application 构造函数中使用 autoscaping=None 关闭)。在不同版本的迁移时要注意向后兼容。
在模板中使用一个你自己编写的函数也是很简单的:只需要将函数名作为模板的参数传递即可,就像其他变量一样。
>>> from tornado.template import Template
>>> def disemvowel(s):
... return ''.join([x for x in s if x not in 'aeiou'])
...
>>> disemvowel("george")
'grg'
>>> print Template("my name is {{d('mortimer')}}").generate(d=disemvowel)
my name is mrtmr
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论