Come si esegue il debug dei modelli Mako?
Domanda
Finora ho trovato impossibile produrre traceback utilizzabili quando i modelli Mako non sono codificati correttamente.
Esiste un modo per eseguire il debug dei modelli oltre all'iterazione per ogni riga di codice?
Soluzione
Mako in realtà fornisce un molto bello modo per rintracciare gli errori in un modello :
from mako import exceptions
try:
template = lookup.get_template(uri)
print template.render()
except:
print exceptions.html_error_template().render()
Altri suggerimenti
Flask-Mako fonte, ho trovato un parametro di configurazione non documentato chiamato MAKO_TRANSLATE_EXCEPTIONS
.
Imposta questo a False
nel vostro Flask app config e si otterrà belle eccezioni zampillante dal modello. Questo compie la stessa cosa come suggerito @Mariano, senza la necessità di modificare l'origine. Apparentemente, questo parametro è stato aggiunto dopo la risposta di Mariano.
I suddividerle in pezzi, e poi ricomporre i pezzi, quando ho trovato il problema.
Non va bene, ma è davvero difficile dire che cosa è andato storto in un grande, modello complesso.
Utilizzando flask_mako, trovo che sia più facile per saltare alla generazione TemplateError e proprio lasciarsi sfuggire l'eccezione. Cioè in flask_mako.py, commentare la parte che rende il TemplateError e basta fare un rilancio:
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
}
Poi vedrete un'eccezione pitone regolare che ha causato il problema insieme ai numeri di riga nel modello.
Combinando le due risposte principali con la mia salsa speciale:
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
Comprende la funzione stock "render_template":
- catturare eccezioni e
- se si esegue il debug, eseguire il rendering di un backtrace
- se non si sta eseguendo il debug, sollevare nuovamente l'eccezione in modo che venga registrata
- rendere la configurazione accessibile dalla pagina (irrilevante)