Tornado 中的一些坑


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

模板路径

[Documentation][tornado.web.Application.settings]

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

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

模板中的特殊别号

[Documentation][tornado-overview-templates]

先来看一段模板代码:

...
<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,然后我们看看它的[文档][tornado.web.RequestHandler.static_url],怎样?这是一个迷惑性比较大的坑。

self.settings?

[Documentation][tornado.web.RequestHandler.settings]

继续看代码:

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

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

[tornado.web.Application.settings]: http://www.tornadoweb.org/en/stable/web.html?highlight=application#tornado.web.Application.settings ""
[tornado-overview-templates]: http://www.tornadoweb.org/en/stable/overview.html#templates ""
[tornado.web.RequestHandler.static_url]: http://www.tornadoweb.org/en/stable/web.html?highlight=static_url#tornado.web.RequestHandler.static_url ""
[tornado.web.RequestHandler.settings]: http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.settings ""

本文发布于 2013-10-30,最后修改于 2016-05-02,被阅读了约 113 次。

- EOF -