龙卷风在模板中呈现参数

时间:2013-12-17 13:43:00

标签: python tornado

我觉得我把它砍成了龙卷风而且形状很糟糕。目标是将错误消息下载到模板中。此错误消息只需要在一个处理程序内(负责同一页面)。

模板行:

{% 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() %}

由于这个问题是在与龙卷风一起工作时全球首次出现的问题,所以仍然感觉很糟糕。

我喜欢扩展渲染,为所有继承的处理程序设置kwargs默认值(它实际上是什么)。我认为这也可能类似于self.current_user的工作原理。

1 个答案:

答案 0 :(得分:4)

官方支持覆盖render(),但覆盖get_template_namespace而不是更加清晰:http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.get_template_namespace

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