python - 模板中的 Tornado 渲染参数

标签 python tornado

我觉得我把它黑进了 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)

这基本上是将错误消息添加到现在的每个渲染中。有没有一种正确的方法可以做到这一点而不影响全局渲染功能?

谢谢!


编辑:

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

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

由于这个问题是全局变量第一次在使用 Tornado 时真正出现,所以这仍然感觉很不妥当。

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

最佳答案

官方支持覆盖 render(),但覆盖 get_template_namespace 更简洁:http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.get_template_namespace

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

关于python - 模板中的 Tornado 渲染参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20635792/

相关文章:

python - Tornado 服务器提供文件

python - 流解析 Wiki Xml 转储

python - 在 Python 中使用堆栈

python - IOLoop.add_callback vs Tornado 中的 IOLoop.add_timeout?

python - 如何让 Tornado 在 ssh 连接断开时不停止?

python - 启动 Tornado 网络

python - 如何将内存中的 zip 文件上传到 S3 存储桶

python - Docker入口点启动脚本exec错误

Python telnetlib 连接到 Scrapy Telnet 以读取统计信息

python - 如何在 Tornado HTTP 服务器上通过 HTTP 让长任务成为 "cancellable"?