如何调试 Jinja2 模板?
Posted
技术标签:
【中文标题】如何调试 Jinja2 模板?【英文标题】:How to debug Jinja2 template? 【发布时间】:2011-01-01 10:07:09 【问题描述】:我在 django 中使用 jinja2 模板系统。 它真的很快,我非常喜欢它。 不过,我在调试模板时遇到了一些问题: 如果我在模板中犯了一些错误(错误的标签、错误的过滤器名称、错误的块结尾......),我根本没有关于这个错误的信息。
例如,在 django 视图中,我这样写:
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('main', 'templates'))
def jinja(req):
template = env.get_template('jinja.html')
output=template.render(myvar='hello')
return HttpResponse(output)
我写了一个jinja2模板:jinja.html:
myvar|notexistingfilter() Jinja !
注意,我故意放置了一个不存在的过滤器来生成错误:
我期待“notexistingfilter() not defined”之类的东西,但我只得到了一个简单的黑白回溯(不是通常的 django 调试消息):
Traceback (most recent call last):
File "/usr/local/lib/python2.6/dist-packages/django/core/servers/basehttp.py", line 279, in run
self.result = application(self.environ, self.start_response)
File "/usr/local/lib/python2.6/dist-packages/django/core/servers/basehttp.py", line 651, in __call__
return self.application(environ, start_response)
File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/wsgi.py", line 241, in __call__
response = self.get_response(request)
File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py", line 134, in get_response
return self.handle_uncaught_exception(request, resolver, exc_info)
File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py", line 154, in handle_uncaught_exception
return debug.technical_500_response(request, *exc_info)
File "/usr/local/lib/python2.6/dist-packages/django/views/debug.py", line 40, in technical_500_response
html = reporter.get_traceback_html()
File "/usr/local/lib/python2.6/dist-packages/django/views/debug.py", line 84, in get_traceback_html
self.get_template_exception_info()
File "/usr/local/lib/python2.6/dist-packages/django/views/debug.py", line 117, in get_template_exception_info
origin, (start, end) = self.exc_value.source
TypeError: 'Template' object is not iterable
我没有得到错误发生的模板文件名,没有关于错误本身的信息,所以很难调试jinja2。
我应该怎么做才能获得更多调试信息并找到 jinja2 模板中的错误位置?
提前谢谢你,
【问题讨论】:
你为什么不使用 Django 的模板?它们与 Jinja2 几乎相同,并且您会收到真正的错误消息。为什么不简单地回到 Django 的模板? 这个秘籍的底部有一些建议为什么要使用 Jinja2 而不是 Django 的模板:appengine-cookbook.appspot.com/recipe/… @S.Lott 我的经验是 Django 的模板与 Jinja 完全不同。 Django 模板迫使我将计算和逻辑与我的模板/演示文稿分开。当我想做一些事情时,例如,用参数调用对象的函数,这是一个巨大的痛苦。我完全赞成良好的模板设计,但不要通过削弱模板系统来强迫它,通过该系统的良好设计和关于最佳实践的良好文档来鼓励它。 哇。我刚刚使用了您关于设置 TEMPLATE_DEBUG = False 的建议/答案,现在我第一次真正从 Jinja 收到有意义的错误消息!!!我一直在通过反复试验、注释掉、取消注释来调试我的模板。您的答案需要在网络上更显眼的地方出现,这是一个巨大的帮助! 【参考方案1】:在做了一些测试后,我找到了答案:
通过直接在 python 下进行相同的模板测试,而不使用 django,会出现调试消息。所以它来自django。
修复在 settings.py 中:必须将 DEBUG 设置为 True 并将 TEMPLATE_DEBUG 设置为 False。
【讨论】:
这个答案在某个地方很容易用谷歌搜索吗?我参考了一两个关于使用 Django 设置 Jinja 的不同教程,但我不记得在哪里看到过这个。我很高兴终于收到 Jinja 的错误消息! @Eric 您可以选择自己的答案作为您问题的答案。【参考方案2】:来自 Jinja2 文档:
我的回溯看起来很奇怪。发生了什么事?
如果加速模块未编译并且您正在使用不带 ctypes 的 Python 安装(不带 ctypes、Jython 或 Google 的 AppEngine 的 Python 2.4)Jinja2 无法提供正确的调试信息,并且回溯可能不完整。目前对于 Jython 或 AppEngine 没有很好的解决方法,因为 ctypes 在那里不可用,并且无法使用加速扩展。
http://jinja.pocoo.org/2/documentation/faq#my-tracebacks-look-weird-what-s-happening
【讨论】:
感谢您的回答。在问我的问题之前,我用加速模块重新编译了 jinja2。我正在为 python 使用 debian 包,所以我想我不在这种情况下......我希望。如何检查 Ubuntu 在其 python 包中使用的 ctypes ???以上是关于如何调试 Jinja2 模板?的主要内容,如果未能解决你的问题,请参考以下文章
Google App Engine、Jinja2 CSS 样式表未加载 (404)