Как вы отлаживаете шаблоны Mako? - PullRequest
36 голосов
/ 24 декабря 2008

До сих пор я считал невозможным создавать полезные трассировки, когда шаблоны Mako не кодированы правильно.

Есть ли способ отладки шаблонов помимо итерации для каждой строки кода?

Ответы [ 5 ]

41 голосов
/ 11 февраля 2009

Мако на самом деле предоставляет ОЧЕНЬ хороший способ отследить ошибки в шаблоне :

from mako import exceptions

try:
    template = lookup.get_template(uri)
    print template.render()
except:
    print exceptions.html_error_template().render()
4 голосов
/ 22 февраля 2014

Глядя на источник Flask-Mako , я обнаружил недокументированный параметр конфигурации под названием MAKO_TRANSLATE_EXCEPTIONS.

Установите это значение на False в конфигурации приложения Flask, и вы получите приятные исключения, всплывающие из шаблона. Это выполняет то же самое, что предложил @Mariano, без необходимости редактировать исходный код. По-видимому, этот параметр был добавлен после ответа Мариано.

1 голос
/ 24 декабря 2008

Я разбиваю их на части, а затем снова собираю их, когда обнаружу проблему.

Не хорошо, но действительно сложно сказать, что пошло не так в большом, сложном шаблоне.

0 голосов
/ 20 сентября 2017

Сочетание двух лучших ответов с моим собственным специальным соусом:

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:

  • ловить исключения и
    • при отладке сделать рендеринг
    • если не происходит отладка, снова вызвать исключение, чтобы оно было записано
  • сделать конфигурацию доступной со страницы (не имеет значения)
0 голосов
/ 10 ноября 2012

Используя 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, которое вызвало проблему, а также номера строк в шаблоне.

...