Tornado 是 Python 上一个很优秀的框架。受 @whtsky 的影响,笔者也成了 Tornado 的使用者。不过 Tornado 还是有些地方会坑人,所以在此吐槽几番。
模板路径
如果没有一些 Tornado 开发的经验,读者很可能会被这里坑了。比如,有个项目用 self.render()
渲染页面,但是在项目根目录没有对应的页面文件,而 Tornado 又是怎么知道模板文件的存放地址呢?因为多数项目遵循把模板文件放在 template/
文件夹的习惯,所以我们自然而然会以为template/
是 Tornado 定义的默认值。其实不然,Tornado 是通过 tornado.web.Application.settings['template_path']
知道模板存放路径的。例子中该值就是 template
。
相应地,static_path
字段也是一个可能被坑的地方。
模板中的特殊别号
先来看一段模板代码:
...
<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?
继续看代码:
class TopicHandler(tornado.web.RequestHandler):
def get(self):
self.render('topic.html', settings=self.settings)
其实这又是别名惹的祸,tornado.web.RequestHandler.settings
的真正来源是 tornado.web.Application.settings
,即第一节提到的配置选项。