2012-04-13 2 views
14

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

ответ

16

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

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

vartec, Спасибо за ваш ответ. Я собираюсь отметить ответ phihag как правильный (несмотря на то, что вы прекрасны) из-за его краткости. –

+1

Это кажется лучшим решением для меня, особенно после прочтения этой полу-предостерегающей истории о locals() http: // stackoverflow. ком/вопросы/1550479/питон-это-с использованием-Vars-местные-а-передовой практики. (Django шаблоны по умолчанию не работают, не так ли?) – jsh

+1

По какой-то причине я никогда не получал 'locals(). Get()' для работы. Однако ваше решение работает нормально. Спасибо! +1 – Micke

14

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

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

замещающий False значением, которое вы хотите, если свойство не установлено.

+2

Как @shenyan пунктов ниже, в некоторых случаях (для меня, если вы передаете в переменных в шаблон с 'render') ваши переменные в конечном итоге в' globals', не 'locals'. Я не уверен, можно ли полагаться на это поведение - здесь немного больше обсуждений: https://groups.google.com/forum/#!topic/python-tornado/MppS69GjZk0. Ответ try/catch является уродливым, но более устойчивым. – tobek

1

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

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

0

У "Tornado way" не должно быть необъявленных переменных. Это более zen, чтобы объявить переменные явными.

Обход:

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

{% if globals().get('grok_error', False) %} 
    error message 
{% end %} 
Смежные вопросы