Как вы отлаживаете шаблоны Mako?
Вопрос
До сих пор я обнаружил, что невозможно создать полезные обратные трассировки, если шаблоны Mako закодированы неправильно.
Есть ли какой-либо способ отладки шаблонов, кроме итерации каждой строки кода?
Решение
Мако на самом деле предоставляет ОЧЕНЬ хороший способ отследить ошибки в шаблоне:
from mako import exceptions
try:
template = lookup.get_template(uri)
print template.render()
except:
print exceptions.html_error_template().render()
Другие советы
Глядя на Колба-Мако источник, я нашел недокументированный параметр конфигурации под названием 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»:
- ловить исключения и
- при отладке визуализируйте обратную трассировку
- если нет отладки, снова вызовите исключение, чтобы оно было зарегистрировано
- сделать конфигурацию доступной со страницы (не имеет значения)