龙卷风在模板中渲染参数

布赖恩

我感觉自己像是将它砍入龙卷风,而且状态很差。目的是将错误消息记录到模板中。该错误消息仅需要在一个处理程序内(负责同一页面)。

模板行:

{% if errormsg is not None %}
<div class="alert-warning">{{ errormsg }}</div>
{% end %}

相关处理程序部分:

if auth:
  self.set_current_user(username)
  self.redirect(self.get_argument("next",u"/"))
else:
  self.errormsg = "Login Failed"
  self.render("login.html", errormsg=self.errormsg)

此时,当errormsg未设置为某项时,我在页面上收到了全局命名空间错误消息。

NameError: global name 'errormsg' is not defined

我发现的解决方法是在BaseHandler中使用全局渲染功能(我不喜欢这一点):

def render(self, template, **kwargs):
  if hasattr(self, 'errormsg'):
    kwargs['errormsg'] = self.errormsg
  else:
    kwargs['errormsg'] = None
  super(BaseHandler, self).render(template, **kwargs)

这基本上将errormsg添加到现在的每个渲染中。有没有一种正确的方法可以做到这一点而又不会与全局渲染功能混为一谈?

谢谢!


编辑:

因为我实际上想做的是将不同/多个,非标准的kwargs参数传递到继承的处理程序中,所以实际上我真的认为我在寻找一种更好的方法来在模板上下文中测试errormsg。

{% if 'errormsg' in globals() %}

由于这个问题是全球人在与龙卷风一起工作时第一次真正露面,所以这感觉还是很容易被破解。

我确实喜欢扩展render来为所有继承的处理程序设置kwargs默认值(实际上是为了什么)。我认为这也可能类似于self.current_user的工作方式。

本·达内尔

render()正式支持覆盖,但覆盖起来要干净一些get_template_namespacehttp : //www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.get_template_namespace

或者,如果errormsg是的属性RequestHandler,则只需访问handler.errormsg模板即可-handler变量始终设置为当前的RequestHandler。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章