本文发自 http://www.binss.me/blog/record-of-learning-tornado-2-template-and-static-file/,转载请注明出处。

在上一篇文章的示例代码里,我们指定了templates和static文件夹的路径。他们分别位于示例代码的同目录下。

和Django非常相似,templates是模版文件夹,存放的是html文件。为什么称之为模版?是因为有别于一般的html文件,我们可以在其中嵌入类似于:She is {{name}}之类的语句,通过在控制器(即示例代码)中指定name=dudu,则其会在渲染的时候将{{name}}替换为dudu,实现网页的动态化。

下面是模版的一些常见用法:

  1. 填充

    模版:{{name}}

    控制器:

    class IndexHandler(tornado.web.RequestHandler):
        def get(self):
            self.render('index.html',name="dudu")

    则index.html 中的{{name}}被渲染为dudu

  2. 表达式

    可以将任何python表达式放在双大括号中执行。

    {{ 1+1 }}{{ ', '.join([str(x_x) for x in range(10)]) }} 等。表达式的运算结果将会在渲染之后替换双大括号。

  3. 控制语句

    支持用控制语句来控制模版显示。

    如:

    <html>
        <body>
            {% if page is None %}
                <h1>{{ header }}</h1>
            {% end %}
            <ul>
            {% for book in books %}
                <li>{{ book }}</li>
            {% end %}
            </ul>
        </body>
    </html>

    用到了条件和循环控制语句,他们都被 {%%} 包围,并用 {% end %}来表示结束。

    注意 {% end %} 不能漏!否则会导致页面渲染错误。

  4. 函数

    Tornado在所有模板中默认提供了一些便利的函数:

    escape(s) 替换字符串s中的&、<、>为他们对应的HTML字符。

    url_escape(s) 使用urllib.quote_plus替换字符串s中的字符为URL编码形式。

    json_encode(val) 将val编码成JSON格式。(在系统底层,这是一个对json库的dumps函数的调用。查阅相关的文档以获得更多关于该函数接收和返回参数的信息。)

    squeeze(s) 过滤字符串s,把连续的多个空白字符替换成一个空格。

    Tornado还支持自定义函数: 模版:{{ mySentence("dudu") }}

    控制器:

    def  mySentence(name):
            return name + "is a girl"

    则渲染时会调用mySentence函数然后将双大括号替换为dudu is a girl

和Django非常相似*10086,static是静态文件文件夹,用于存放js,css,图片等静态文件。然后可以通过static_url函数来生成static目录下文件的URL。

如:

<link rel="stylesheet" href="{{ static_url("style.css") }}">

可以导入static文件夹下的style.css文件。

为什么使用static_url而不是在模板中硬编码呢?

  1. static_url函数创建了一个基于文件内容的hash值,并将其添加到URL末尾(如/static/style.css?v=ab12)。这个hash值确保浏览器总是加载一个文件的最新版而不是之前的缓存版本。

  2. 改变url结构时(如把static文件夹名称改为s)不需要改变模板中的代码。

Tornado的模版和静态文件机制几乎和Django相似度达到95%以上,在一些小特性上(如自定义函数,static_url等)方面甚至做的比Django更贴心。

下一篇文章将会讲和Django更相似的模版拓展(继承)和模块系统。