本文发自 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,实现网页的动态化。
下面是模版的一些常见用法:
-
填充
模版:
{{name}}
控制器:
class IndexHandler(tornado.web.RequestHandler): def get(self): self.render('index.html',name="dudu")
则index.html 中的{{name}}被渲染为dudu
-
表达式
可以将任何python表达式放在双大括号中执行。
如
{{ 1+1 }}
,{{ ', '.join([str(x_x) for x in range(10)]) }}
等。表达式的运算结果将会在渲染之后替换双大括号。 -
控制语句
支持用控制语句来控制模版显示。
如:
<html> <body> {% if page is None %} <h1>{{ header }}</h1> {% end %} <ul> {% for book in books %} <li>{{ book }}</li> {% end %} </ul> </body> </html>
用到了条件和循环控制语句,他们都被
{%
和%}
包围,并用{% end %}
来表示结束。注意
{% end %}
不能漏!否则会导致页面渲染错误。 -
函数
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而不是在模板中硬编码呢?
-
static_url函数创建了一个基于文件内容的hash值,并将其添加到URL末尾(如
/static/style.css?v=ab12
)。这个hash值确保浏览器总是加载一个文件的最新版而不是之前的缓存版本。 -
改变url结构时(如把static文件夹名称改为s)不需要改变模板中的代码。
Tornado的模版和静态文件机制几乎和Django相似度达到95%以上,在一些小特性上(如自定义函数,static_url等)方面甚至做的比Django更贴心。
下一篇文章将会讲和Django更相似的模版拓展(继承)和模块系统。