python - ¿Cómo se depuran las plantillas de Mako?
debugging templates (5)
Al observar la fuente de Flask-Mako , encontré un parámetro de configuración no documentado llamado MAKO_TRANSLATE_EXCEPTIONS
.
Establezca esto en False
en la configuración de su aplicación Flask y obtendrá bonitas excepciones que brotarán de la plantilla. Esto logra lo mismo que sugirió @Mariano, sin necesidad de editar la fuente. Aparentemente, este parámetro se agregó después de la respuesta de Mariano.
Hasta ahora, he encontrado que es imposible producir trazabilidad utilizable cuando las plantillas de Mako no están codificadas correctamente.
¿Hay alguna forma de depurar plantillas además de iterar para cada línea de código?
Combinando las dos mejores respuestas con mi propia salsa especial:
from flask.ext.mako import render_template as render_template_1
from mako import exceptions
app.config[''MAKO_TRANSLATE_EXCEPTIONS''] = False # seems to be necessary
def render_template(*args, **kwargs):
kwargs2 = dict(**kwargs)
kwargs2[''config''] = app.config # this is irrelevant, but useful
try:
return render_template_1(*args, **kwargs2)
except:
if app.config.get(''DEBUG''):
return exceptions.html_error_template().render()
raise
Envuelve la función stock "render_template":
- atrapar excepciones, y
- si se depura, renderiza una traza inversa
- si no se está depurando, levante la excepción nuevamente para que se registre
- hacer que la configuración sea accesible desde la página (irrelevante)
Los descompongo en pedazos, y luego vuelvo a armar las piezas cuando encuentro el problema.
No es bueno, pero es muy difícil decir qué salió mal en una plantilla grande y compleja.
Mako en realidad proporciona una manera MUY agradable de localizar errores en una plantilla :
from mako import exceptions
try:
template = lookup.get_template(uri)
print template.render()
except:
print exceptions.html_error_template().render()
Usando flask_mako, me parece más fácil omitir la generación de TemplateError y simplemente pasar la excepción. Es decir, en flask_mako.py, comenta la parte que hace el TemplateError y acaba de hacer un aumento:
def _render(template, context, app):
"""Renders the template and fires the signal"""
app.update_template_context(context)
try:
rv = template.render(**context)
template_rendered.send(app, template=template, context=context)
return rv
except:
#translated = TemplateError(template)
#raise translated
raise
}
Luego verá una excepción de python regular que causó el problema junto con los números de línea en la plantilla.