Wie debuggen Sie Mako-Vorlagen?
Frage
Bisher habe ich finde es unmöglich, brauchbare Rückverfolgungen zu erzeugen, wenn Mako-Vorlagen nicht richtig codiert sind.
Gibt es eine Möglichkeit zum Debuggen von Vorlagen außer für jede Codezeile Iterieren?
Lösung
Mako tatsächlich ein Fehler aufzuspüren in einer Vorlage :
from mako import exceptions
try:
template = lookup.get_template(uri)
print template.render()
except:
print exceptions.html_error_template().render()
Andere Tipps
Mit Blick auf die Flask-Mako Quelle, fand ich eine nicht dokumentierte Konfigurationsparameter namens MAKO_TRANSLATE_EXCEPTIONS
.
Dieses Set in Ihrer Flask App config False
und Sie schöne Ausnahmen von der Vorlage sprudeln erhalten. Dies erreicht die gleichen wie @Mariano vorgeschlagen, ohne dass die Quelle zu bearbeiten. Offenbar wurde dieser Parameter hinzugefügt, nachdem Mariano Antwort.
ich sie in Stücke brechen nach unten und dann die Stücke wieder zusammen, wenn ich das Problem gefunden haben.
Nicht gut, aber es ist wirklich schwer zu sagen, was in einer großen, komplexen Vorlage falsch gelaufen ist.
Mit flask_mako finde ich, es ist einfacher, die TemplateError Generation zu überspringen und nur die Ausnahme verzichten. D. h in flask_mako.py, das Teil auf Kommentar, der die TemplateError und nur das tun, eine Erhöhung macht:
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
}
Dann werden Sie eine regelmäßige Python Ausnahme sehen, die das Problem zusammen mit Zeilennummern in der Vorlage verursacht wird.
die beide Top-Antworten mit meiner eigenen Sauce Kombination:
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
Es wickelt den Bestand "render_template" Funktion:
- fangen Ausnahmen und
- , wenn das Debuggen, machen einen Backtrace
- , wenn nicht das Debuggen, heben die Ausnahme wieder so wird es protokolliert werden
- macht von der Seite zugänglich config (irrelevant)