Вопрос

До сих пор я обнаружил, что невозможно создать полезные обратные трассировки, если шаблоны 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»:

  • ловить исключения и
    • при отладке визуализируйте обратную трассировку
    • если нет отладки, снова вызовите исключение, чтобы оно было зарегистрировано
  • сделать конфигурацию доступной со страницы (не имеет значения)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top