Tornado 中的一些坑

Tornado 是 Python 上一个很优秀的框架。受 @whtsky 的影响,笔者也成了 Tornado 的使用者。不过 Tornado 还是有些地方会坑人,所以在此吐槽几番。

模板路径

Documentation

如果没有一些 Tornado 开发的经验,读者很可能会被这里坑了。比如,有个项目用 self.render() 渲染页面,但是在项目根目录没有对应的页面文件,而 Tornado 又是怎么知道模板文件的存放地址呢?因为多数项目遵循把模板文件放在 template/ 文件夹的习惯,所以我们自然而然会以为template/ 是 Tornado 定义的默认值。其实不然,Tornado 是通过 tornado.web.Application.settings['template_path'] 知道模板存放路径的。例子中该值就是 template

相应地,static_path 字段也是一个可能被坑的地方。

模板中的特殊别号

Documentation

先来看一段模板代码:

...
<head>
    <title>Hello, World!</title>
    <link rel="stylesheet" href="{{ static_url('style.css') }}" />
...

对应的渲染代码是这样的:

#...
self.render('index.html')
#...

看出端倪了吧,模板代码里突然窜出一个 static_url,而且我们并未在 render() 里提供它。这其实是 tornado.template 中定义的特殊别名。它的庐山真面目是这样的 tornado.web.RequestHandler.static_url,然后我们看看它的文档,怎样?这是一个迷惑性比较大的坑。

self.settings?

Documentation

继续看代码:

class TopicHandler(tornado.web.RequestHandler):
    def get(self):
        self.render('topic.html', settings=self.settings)

其实这又是别名惹的祸,tornado.web.RequestHandler.settings 的真正来源是 tornado.web.Application.settings,即第一节提到的配置选项。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据