2012-04-13 22 views
14

Esta es una plantilla de tornado (por ejemplo, en el archivo de logout.html) me hacen en un error en el proceso de cierre de sesión:Manejo de una variable de plantilla indefinida en Tornado

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

Esto puede ser llamado usando

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

Si el cierre de sesión se realiza correctamente, tengo que hacer

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

Si hago caso logout_error=False, consigo

NameError: global name 'logout_error' is not defined 

Si hay muchos indicadores (que son falsos), los argumentos de la palabra clave pueden acumularse. ¿Hay alguna manera en que pueda pedirle a la plantilla que considere logout_error como False si no existe?

Respuesta

16

Hackear utilizando locals().get() es una forma de hacerlo. Otro, un poco más ortodoxo está usando try. plantilla tornado lo soporta, por lo que puede:

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

vartec, gracias por su respuesta. Voy a marcar la respuesta de phihag como correcta (a pesar de que está bien) debido a su brevedad –

+1

. Esta parece ser la mejor solución para mí, especialmente después de leer este cuento semiacampo sobre los lugareños() http: // stackoverflow. com/questions/1550479/python-is-using-vars-locals-a-good-practice. (Las plantillas de Django fallan silenciosamente de forma predeterminada, ¿no?) – jsh

+1

Por algún motivo, nunca obtuve 'locals(). Get()' para que funcione. Tu solución funciona bien sin embargo. ¡Gracias! +1 – Micke

14

Puede utilizar

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

Sustituto False con el valor que desea si la propiedad no está establecida.

+2

Como puntos @shenyan a cabo a continuación, en algunas circunstancias (para mí, si pasa en las variables de la plantilla con 'render') las variables terminan en' globals', no 'locales'. No estoy seguro de si es seguro confiar en este comportamiento: un poco más de discusión aquí: https://groups.google.com/forum/#!topic/python-tornado/MppS69GjZk0. La respuesta try/catch es fea pero es más resistente. – tobek

0

La "manera de Tornado" es no tener variables no declaradas. Es más zen declarar las variables explícitas.

Solución:

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

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