Comment pensez-vous des modèles de déboguer Mako?
Question
Jusqu'à présent, je l'ai trouvé impossible de produire tracebacks utilisables lorsque les modèles Mako ne sont pas codés correctement.
est-il un moyen de modèles de débogage en plus itérer pour chaque ligne de code?
La solution
Mako fournit en fait un très belle façon de traquer les erreurs dans un modèle :
from mako import exceptions
try:
template = lookup.get_template(uri)
print template.render()
except:
print exceptions.html_error_template().render()
Autres conseils
En regardant le Flask-Mako source de, j'ai trouvé un paramètre de configuration non documentée appelée MAKO_TRANSLATE_EXCEPTIONS
.
Définir à False
dans votre config app Flask et vous aurez de belles exceptions jaillissant à partir du modèle. Ceci accomplit la même chose que suggéré @Mariano, sans avoir besoin de modifier la source. Apparemment, ce paramètre a été ajouté après la réponse de Mariano.
Je les décomposer en morceaux, puis rassembler les morceaux quand je l'ai trouvé le problème.
Pas bon, mais il est vraiment difficile de dire ce qui a mal tourné dans un grand modèle complexe.
Utilisation flask_mako, je trouve qu'il est plus facile de sauter sur la génération de TemplateError et juste laisser passer l'exception. C'est à dire. en flask_mako.py, commentez la partie qui fait la TemplateError et juste faire une augmentation:
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
}
Ensuite, vous verrez une exception python régulière qui a causé le problème ainsi que les numéros de ligne dans le modèle.
En combinant les deux premières réponses avec ma propre sauce spéciale:
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
Il enveloppe le stock fonction "render_template":
- exceptions de capture et
- si le débogage, rendre un backtrace
- sinon le débogage, soulever l'exception encore une fois il sera connecté
- make config accessible depuis la page (sans objet)