Обработка переменной шаблона undefined в Tornado

Это шаблон торнадо (скажем, в файле 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, если он не существует?

Ответы

Ответ 1

Взлом с использованием locals().get() - это один из способов сделать это. Другой, немного более ортодоксальный, использует try. Шаблон Tornado поддерживает его, поэтому вы можете:

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

Ответ 2

Вы можете использовать

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

Замените False на нужное значение, если свойство не установлено.

Ответ 3

{%, если locals(). get ('logout_error', False)%} не работает, потому что переменные не передаются как в ** kwargs;

{% if globals(). has_key ('logout_error')%} работает для меня, потому что мои переменные передаются отдельно, https://groups.google.com/forum/#!topic/python-tornado/dyl50NO3yzE на этой странице больше внимания не уделяется этой проблеме.

Ответ 4

"Способ Tornado" состоит в том, чтобы не иметь необъявленных переменных. Это более zen, чтобы объявить переменные явными.

Обход проблемы:

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

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