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?

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top