返回介绍

2.2 模板语法

发布于 2025-03-08 19:24:49 字数 3799 浏览 0 评论 0 收藏 0

既然我们已经看到了一个模板在实际应用中的简单例子,那么让我们深入地了解它们是如何工作的吧。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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文