如何调试 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)

如何调试 KnockoutJS 的模板绑定错误?

如何调试非常慢(客户端)的网站模板?

如何调试 CSS 分页媒体模板?

如何在 FreeMarker 模板中调试低效的 JCR 查询?

使用 GDB 调试模板