你如何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_EXCEPTIONS
configuration参数。
在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从页面访问(无关)