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?

War es hilfreich?

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top