简体   繁体   中英

Handling an undefined template variable in Tornado

This is a tornado template (say, in the file logout.html) I render on an error in the logout process:

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

This can be called using

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

If the logout is successful, I have to do

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

If I ignore logout_error=False , I get

NameError: global name 'logout_error' is not defined

If there are a lot of flags (which are false), the keyword arguments can pile up. Is there a way I can ask the template to consider logout_error as False if it does not exist?

Hacking around using locals().get() is one way to do it. Another, bit more orthodox is using try . Tornado template supports it, so you can:

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

You can use

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

Substitute False with the value you want if the property is not set.

{% if locals().get('logout_error', False) %} not works because variables not passed as in **kwargs;

{% if globals().has_key('logout_error') %} works to me because my variables are passed separately, https://groups.google.com/forum/#!topic/python-tornado/dyl50NO3yzE this page has more disscussion on this problem.

The "Tornado way" is to not have undeclared variables. It's more zen to declare the variables explicit.

Workaround:

{% if 'grok' in globals() %}
  {{grok}}
{% end %}

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM