Pregunta

Hasta ahora he encontrado que es imposible producir tracebacks utilizables cuando las plantillas Mako no están codificados correctamente.

¿Hay alguna manera de las plantillas de depuración, además de la iteración para cada línea de código?

¿Fue útil?

Solución

Mako en realidad ofrece una forma muy agradable para el diagnóstico de problemas en una plantilla :

from mako import exceptions

try:
    template = lookup.get_template(uri)
    print template.render()
except:
    print exceptions.html_error_template().render()

Otros consejos

Mirando el matraz de Mako fuente , he encontrado un parámetro de configuración indocumentado llamado MAKO_TRANSLATE_EXCEPTIONS.

Ponga esto a False en su frasco de aplicación de configuración y obtendrá buenos excepciones que burbujea desde la plantilla. Con esto se logran lo mismo que sugirió @Mariano, sin necesidad de modificar el código fuente. Al parecer, se añadió este parámetro después de la respuesta de Mariano.

Me rompen en pedazos, y luego volver a montar las piezas cuando me he encontrado el problema.

No es bueno, pero es muy difícil saber lo que salió mal en una gran plantilla, compleja.

El uso de flask_mako, me parece que es más fácil de pasar por alto la generación TemplateError y simplemente dejar pasar la excepción. Es decir. en flask_mako.py, comente la parte que hace la TemplateError y sólo hacer una subida:

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

}

A continuación, verá una excepción pitón regular que causó el problema, junto con los números de línea en la plantilla.

La combinación de las dos respuestas principales 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

Se envuelve la función de "render_template":

  • capturar excepciones y
    • Si la depuración, hacer una traza
    • si no se depura, aumentar la excepción de nuevo por lo que se registra
  • make config accesible desde la página (irrelevante)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top