Tipfy与Jinja:为每个页面创建注销链接

3 投票
2 回答
697 浏览
提问于 2025-04-17 07:24

我有一个jinja模板,里面有一些常用的链接,其中一个是“注销”链接。这个链接的地址需要在页面渲染之前,通过Users.create_logout_url()来生成。

我希望能避免在每一个get/post处理函数中都去生成这个链接并把它加到我的render_response里。我查了一些其他的方法,但还没找到一个有效的解决方案。

BaseRequestHandler

这个方法看起来是最干净的,但我不太确定该怎么做。是不是可以这样:

self.vars['logout_link'] = users.create_logout_url(self.request.path))

然后,在所有标准的响应处理函数中:

return render_response('template.html', **vars)

?

装饰器

这似乎是另一个选择,不过看起来有点乱。我想它的工作原理可能是一样的(在一个包装函数中把注销链接赋值给一个局部变量)。

上下文处理?

我在使用tipfy/jinja,似乎不支持这个,至少我目前的了解是这样的。

有没有建议我应该进一步研究哪个方向呢?

谢谢

2 个回答

4

因为我没有使用过这两个框架,所以不太确定有没有简单的方法可以把它们加到模板里。可能有一些中间件可以用,但正如我所说,我对这些框架没有经验。

不过,你有没有考虑过设置一个通用的注销链接,然后用一个处理程序给用户返回正确的链接,状态码是303?

6

我用Jinja和GAE做了类似的事情,我创建了一个基础处理器(BaseHandler)和一个我会包含的模板。基础处理器的代码如下:

class BaseHandler(webapp2.RequestHandler):
    ...
    def render_jinja(self, name, **data):
        data['logout_url']=users.create_logout_url(self.request.uri)
        template = jinja_environment.get_template('templates/'+name+'.html')
        self.response.out.write(template.render(data))

然后我可以让其他处理器,比如表单处理器,继承这个基础处理器,代码如下:

class FileUploadFormHandler(BaseHandler):
    def get(self):
        ...
        self.render_jinja('contact_jinja', form=form, ...

撰写回答