2012-04-13 10 views
14

Jest to szablon tornado (powiedzmy, w logout.html pliku) Ja render na błąd w procesie wylogowania:Handling niezdefiniowanej zmiennej szablonu w Tornado

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

ten można wywołać za pomocą

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

Jeśli wylogowania się powiedzie, będę musiał zrobić

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

Gdybym ignorować logout_error=False, otrzymuję

NameError: global name 'logout_error' is not defined 

Jeśli istnieje wiele flag (które są fałszywe), argumenty słów kluczowych można mnożyć. Czy istnieje sposób, w jaki mogę poprosić szablon, aby rozważył logout_error jako False, jeśli nie istnieje?

Odpowiedz

16

Hackowanie przy użyciu locals().get() jest jednym ze sposobów, aby to zrobić. Innym, nieco bardziej ortodoksyjnym jest używanie try. Tornado szablon obsługuje go, więc można:

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

vartec, Dzięki za odpowiedź. Zamierzam oznaczyć odpowiedź phihaga jako poprawną (pomimo tego, że wszystko jest w porządku) ze względu na jej zwięzłość. –

+1

To wydaje się lepszym rozwiązaniem dla mnie, szczególnie po przeczytaniu tej półprzekupczej opowieści o locals() http: // stackoverflow. com/questions/1550479/python-używa-vars-locals-a-good-practice. (Szablony Django domyślnie nie działają domyślnie, czyż nie?) – jsh

+1

Z jakiegoś powodu nigdy nie udało mi się uruchomić 'locals(). Get()'. Twoje rozwiązanie działa dobrze. Dziękuję Ci! +1 – Micke

14

Można użyć

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

zastępczy False z wartością chcesz, jeśli właściwość nie jest ustawiona.

+2

Jako punkty @shenyan poniżej, w pewnych okolicznościach (dla mnie, jeśli przechodzą w zmiennych do szablonu z 'render') Twoje zmienne skończyć w' globals', nie 'locals'. Nie jestem pewien, czy można na tym polegać - trochę więcej dyskusji tutaj: https://groups.google.com/forum/#!topic/python-tornado/MppS69GjZk0. Odpowiedź try/catch jest brzydka, ale jest bardziej odporna. – tobek

0

"Droga Tornada" nie ma niezadeklarowanych zmiennych. Więcej zen deklaruje wyraźne zmienne.

Obejście:

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

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