将变量传递给Tornado基础模板

4 投票
1 回答
1203 浏览
提问于 2025-04-18 17:25

我有一个基础模板叫做 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 }}了。

撰写回答