python debugging templates jinja2 mako

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.



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.