将变量传递给Tornado基础模板
我有一个基础模板叫做 base.html,其他模板都是从这个模板继承的。
当用户登录后,我想在 base.html 定义的导航栏上显示他们的用户ID。
所以我写了:
class CloseHandler(tornado.web.RequestHandler):
def get(self):
ui=db.users.find_one({"Username": ui0})
self.render("thanks.html" , ui1 = ui["Username"])
我还想在基础模板中显示 ui1 的值,格式是:<p>{{ ui1 }}</p>
解决这个问题的唯一办法就是把我的导航栏的 HTML 代码从 base.html 中移走,然后把它插入到每一个其他模板里。
但是我遇到了这个错误:
NameError: global name 'ui1' is not defined
我尝试把这个设置成全局变量,但还是出现同样的错误。
那么,变量应该怎么在不同的模板中使用呢?
1 个回答
2
我知道这个问题已经有点时间了,但我建议你创建一个基础类,让你的处理器去继承这个类:
class BaseHandler(tornado.web.RequestHandler):
。这样做可以让你添加一些所有处理器都能用的功能。
接下来,你可以扩展这个tornado.web.RequestHandler.get_template_namespace()
函数,把你的全局变量添加到命名空间里:
# class BaseHandler
def get_template_namespace(self):
namespace = super(BaseHandler, self).get_template_namespace()
namespace.update({
'username': self.get_current_username() # or however you retrieve users
})
return namespace
所有传递到命名空间的内容都会在你的所有处理器中通过self.render
提供。
现在你可以在base.html或者继承它的视图中访问{{ username }}
了。