你如何debuggingMako模板?

到目前为止,我发现当Mako模板编码不正确时,不可能产生可用的回溯。

除了迭代每行代码之外,还有什么方法可以debugging模板吗?

Mako实际上提供了一个非常好的方法来追踪模板中的错误 :

from mako import exceptions try: template = lookup.get_template(uri) print template.render() except: print exceptions.html_error_template().render() 

看着Flask-Mako源代码,我发现一个名为MAKO_TRANSLATE_EXCEPTIONS的未MAKO_TRANSLATE_EXCEPTIONSconfiguration参数。

在Flask应用程序configuration中将其设置为False ,您将从模板中获得很好的exception。 这完成了@Marianobuild议的同样的事情,而不需要编辑源代码。 显然,这个参数是在Mariano的回答之后添加的。

我把它们分解成碎片,然后在发现问题时重新组装。

不好,但是很难说出一个大的,复杂的模板出了什么问题。

使用flask_mako,我发现跳过TemplateError代更容易,只是传递exception。 即在flask_mako.py中,注释掉模板错误的部分,然后加注:

 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 

}

然后,你会看到一个普通的pythonexception,导致问题以及模板中的行号。

结合两个最佳答案与我自己的特殊酱油:

 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”function:

  • 捕获exception,和
    • 如果debugging,则渲染回溯
    • 如果没有debugging,再次引发exception,这样就会被logging下来
  • 使configuration从页面访问(无关)