如何调试 Mako 模板?
到目前为止,我发现当 Mako 模板编码不正确时,不可能生成可用的回溯。
除了迭代每一行代码之外,还有什么方法可以调试模板吗?
So far I've found it impossible to produce usable tracebacks when Mako templates aren't coded correctly.
Is there any way to debug templates besides iterating for every line of code?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
Mako 实际上提供了一种非常好的方法来跟踪模板中的错误:
Mako actually provides a VERY nice way to track down errors in a template:
查看 Flask-Mako 源代码,我发现了一个名为
MAKO_TRANSLATE_EXCEPTIONS
。在 Flask 应用程序配置中将其设置为 False,您将从模板中得到很好的异常。 这完成了与 @Mariano 建议相同的事情,而不需要编辑源代码。 显然,这个参数是在马里亚诺回答后添加的。
Looking at the Flask-Mako source, I found an undocumented configuration parameter called
MAKO_TRANSLATE_EXCEPTIONS
.Set this to
False
in your Flask app config and you'll get nice exceptions bubbling up from the template. This accomplishes the same thing as @Mariano suggested, without needing to edit the source. Apparently, this parameter was added after Mariano's answer.我把它们分解成碎片,然后当我发现问题时重新组装这些碎片。
不好,但是很难判断一个大而复杂的模板出了什么问题。
I break them down into pieces, and then reassemble the pieces when I've found the problem.
Not good, but it's really hard to tell what went wrong in a big, complex template.
我对 Mako 的主要不满是很难看出模板中发生了什么。 由于模板代码是内存中的可运行对象,因此调试器无法查看它。
一种解决方案是将模板代码写入文件,然后使用该文件作为标准 python 模块重新运行模板。 然后你就可以随心所欲地调试了。
一个例子:
My main frustration with Mako was that it was hard to see what was happening in the template. As the template code is a runnable object that is in-memory, no debugger can look into it.
One solution is to write the template code to file, and re-run the template using this file as a standard python module. Then you can debug to your hearts content.
An example:
使用flask_mako,我发现更容易跳过TemplateError 生成并忽略异常。 即在flask_mako.py 中,注释掉导致TemplateError 的部分,然后进行引发:
}
然后您将看到导致问题的常规Python 异常以及模板中的行号。
Using flask_mako, I find it's easier to skip over the TemplateError generation and just pass up the exception. I.e. in flask_mako.py, comment out the part that makes the TemplateError and just do a raise:
}
Then you'll see a regular python exception that caused the problem along with line numbers in the template.
将两个最佳答案与我自己的特殊酱相结合:
它包装了库存“render_template”函数:
Combining the two top answers with my own special sauce:
It wraps the stock "render_template" function: