До сих пор я не мог создать пригодные трассировки, когда шаблоны Мако не были правильно закодированы.
Есть ли способ отлаживать шаблоны, кроме итерации для каждой строки кода?
До сих пор я не мог создать пригодные трассировки, когда шаблоны Мако не были правильно закодированы.
Есть ли способ отлаживать шаблоны, кроме итерации для каждой строки кода?
Mako фактически обеспечивает ОЧЕНЬ хороший способ отслеживания ошибок в шаблоне:
from mako import exceptions
try:
template = lookup.get_template(uri)
print template.render()
except:
print exceptions.html_error_template().render()
Глядя на источник Flask-Mako, я обнаружил недокументированный параметр конфигурации с именем MAKO_TRANSLATE_EXCEPTIONS
.
Установите для этого параметра False
в конфигурацию приложения Flask, и вы получите хорошие исключения, пузырящиеся из шаблона. Это делает то же, что предложил @Mariano, без необходимости редактировать источник. По-видимому, этот параметр был добавлен после ответа Мариано.
Я разбиваю их на куски, а затем собираю куски, когда обнаружил проблему.
Нехорошо, но очень сложно сказать, что пошло не так в большом сложном шаблоне.
Используя flask_mako, мне легче пропустить создание TemplateError и просто исключить исключение. То есть в flask_mako.py, закомментируйте часть, которая делает TemplateError, и просто сделайте рейз:
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
}
Затем вы увидите регулярное исключение python, которое вызвало проблему вместе с номерами строк в шаблоне.
Сочетание двух верхних ответов с моим собственным специальным соусом:
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
Он обертывает функцию "render_template" на складе: