tornado 4.5.2
配置模板
- 默认情况下,Tornado会查找Application setting中template_path。
- 如果当前代码中不同的处理函数有不同的模板路径,且重写了RequeHandler.get_template_path方法,那么template_path为该方法返回的路径。
- 源代码如下
def get_template_path(self):
"""Override to customize template path for each handler.
By default, we use the ``template_path`` application setting.
Return None to load templates relative to the calling file.
"""
return self.application.settings.get("template_path")
- 如果没有找到那么tornado就会在和当前.py文件相同的目录查找相关联的模板文件。源代码如下:
def render_string(self, template_name, **kwargs):
"""Generate the given template with the given arguments.
We return the generated byte string (in utf8). To generate and
write a template as a response, use render() above.
"""
# If no template_path is specified, use the path of the calling file
template_path = self.get_template_path()
"""
如下代码表明没找到template_path的情况下,会查找同目录下相关联的模板文件
"""
if not template_path:
frame = sys._getframe(0)
web_file = frame.f_code.co_filename
while frame.f_code.co_filename == web_file:
frame = frame.f_back
template_path = os.path.dirname(frame.f_code.co_filename)
with RequestHandler._template_loader_lock:
if template_path not in RequestHandler._template_loaders:
loader = self.create_template_loader(template_path)
RequestHandler._template_loaders[template_path] = loader
else:
loader = RequestHandler._template_loaders[template_path]
t = loader.load(template_name)
namespace = self.get_template_namespace()
namespace.update(kwargs)
return t.generate(**namespace)
为了从非文件系统位置加载模板,实例化子类tornado.template.BaseLoader 并为其在应用设置(application setting)中配置template_loader。
默认情况下编译出来的模板会被缓存;为了不被缓存和修改代码后重加载总是可见,使用应用设置(application settings)中的compiled_template_cache=False 或 debug=True。
tornado.web.Application可以说是一个设置容器。