【问题标题】:Handling an undefined template variable in Tornado在 Tornado 中处理未定义的模板变量
【发布时间】:2012-04-13 10:43:26
【问题描述】:

这是一个龙卷风模板(例如,在文件 logout.html 中)我在注销过程中出现错误时呈现:

  {% if logout_error %}
    Oops! The logout failed. Please close all open documents and try again
  {% end %}

这可以调用

self.render("logout.html", logout_error=True)

如果注销成功,我必须这样做

self.render("logout.html", logout_error=False)

如果我忽略logout_error=False,我会得到

NameError: global name 'logout_error' is not defined

如果有很多标志(为假),关键字参数可能会堆积。有没有办法让模板将logout_error 视为False(如果它不存在)?

【问题讨论】:

    标签: python tornado


    【解决方案1】:

    使用locals().get() 进行黑客攻击是一种方法。另一个更正统的方法是使用try。 Tornado 模板支持它,所以你可以:

    {% try %}
      {% if logout_error %}
        Oops! The logout failed. Please close all open documents and try again
      {% end %}
    {% except %}
    {% end %}
    

    【讨论】:

    • vartec,感谢您的回答。由于它的简洁性,我将把 phihag 的答案标记为正确(尽管你的答案很好)
    • 这对我来说似乎是更好的解决方案,尤其是在阅读了这个关于 locals() stackoverflow.com/questions/1550479/… 的半警示故事之后。 (默认情况下,Django 模板会静默失败,不是吗?)
    • 出于某种原因,我从来没有让locals().get() 工作。您的解决方案工作正常。谢谢! +1
    【解决方案2】:

    你可以使用

    {% if locals().get('logout_error', False) %}
    

    如果未设置该属性,请将 False 替换为您想要的值。

    【讨论】:

    • 正如@shenyan 在下面指出的那样,在某些情况下(对我而言,如果您使用render 将变量传递给模板)您的变量最终会出现在globals,而不是locals。我不确定依赖这种行为是否安全 - 在这里进行更多讨论:groups.google.com/forum/#!topic/python-tornado/MppS69GjZk0。 try/catch 的答案很难看,但更有弹性。
    【解决方案3】:

    {% if locals().get('logout_error', False) %} 不起作用,因为变量没有像在 **kwargs 中那样传递;

    {% if globals().has_key('logout_error') %} 对我有用,因为我的变量是单独传递的, https://groups.google.com/forum/#!topic/python-tornado/dyl50NO3yzE这个页面有更多关于这个问题的讨论。

    【讨论】:

      【解决方案4】:

      “Tornado 方式”是没有未声明的变量。显式声明变量更有禅意。

      解决方法:

      {% if 'grok' in globals() %}
        {{grok}}
      {% end %}
      
      {% if globals().get('grok_error', False) %}
        error message
      {% end %}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-02
        • 2017-05-19
        • 1970-01-01
        • 1970-01-01
        • 2012-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多