Como você depurar modelos Mako?
Pergunta
Até agora, eu achava impossível produzir tracebacks utilizáveis ??quando templates Mako não são codificados corretamente.
Existe alguma maneira de modelos de depuração além iteração para cada linha de código?
Solução
Mako realmente fornece um maneira muito agradável para rastrear erros em um modelo :
from mako import exceptions
try:
template = lookup.get_template(uri)
print template.render()
except:
print exceptions.html_error_template().render()
Outras dicas
Olhando fonte do balão de Mako , eu encontrei um parâmetro de configuração não documentada chamada MAKO_TRANSLATE_EXCEPTIONS
.
Defina como False
em seu aplicativo de configuração Flask e você terá boas exceções borbulhando a partir do modelo. Isso realiza a mesma coisa que @Mariano sugeriu, sem a necessidade de editar a fonte. Aparentemente, este parâmetro foi adicionado após a resposta de Mariano.
Eu dividi-los em pedaços, e, em seguida, remontar os pedaços quando eu encontrei o problema.
Não é bom, mas é realmente difícil dizer o que deu errado em uma grande, modelo complexo.
Usando flask_mako, eu acho que é mais fácil de pular a geração TemplateError e apenas deixar passar a exceção. Ou seja, em flask_mako.py, comentário fora a parte que faz a TemplateError e apenas fazer um raise:
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
}
Em seguida, você verá uma exceção python regular que causou o problema, juntamente com os números de linha no modelo.
A combinação das duas melhores respostas com o meu próprio molho especial:
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
Ela envolve a função de estoque "render_template":
- exceções captura e
- Se a depuração, prestar um backtrace
- Se não depuração, aumentar a exceção novamente por isso vai estar conectado
- make config acessível a partir da página (irrelevante)