Python 如何调试Jinja2模板?

Python 如何调试Jinja2模板?,python,django,jinja2,Python,Django,Jinja2,我在django中使用jinja2模板系统。 它真的很快,我非常喜欢它。 然而,我在调试模板时遇到了一些问题: 如果我在模板中犯了一些错误(错误的标记、错误的过滤器名称、错误的块结束…),我根本没有关于这个错误的信息 例如,在django视图中,我编写了以下内容: from jinja2 import Environment, PackageLoader env = Environment(loader=PackageLoader('main', 'templates')) def jinja

我在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调试消息):

我没有得到发生错误的模板文件名,没有关于错误本身的信息,因此调试jinja2非常困难

我应该怎么做才能获得更多的调试信息,并找到jinja2模板中的错误位置


提前感谢您,

来自Jinja2文档:

我的回溯看起来很奇怪。发生了什么事?

如果没有编译加速模块,并且您使用的Python安装没有ctypes(Python2.4没有ctypes,Jython或Google的AppEngine),Jinja2将无法提供正确的调试信息,并且回溯可能不完整。目前Jython或AppEngine没有很好的解决方案,因为ctypes在那里不可用,并且不可能使用加速扩展


在做了更多的测试后,我找到了答案:

通过直接在python下执行相同的模板测试,而不使用django,就可以显示调试消息。所以它来自django


修复程序在settings.py中:必须将DEBUG设置为True,并将TEMPLATE\u DEBUG设置为False。

为什么不使用Django的模板?它们几乎与Jinja2相同,您会收到真正的错误消息。为什么不简单地回到Django的模板呢?这个配方的底部有一些建议,为什么要使用Jinja2而不是Django的模板:@s.Lott我的经验是Django的模板一点也不像Jinja。Django模板迫使我将计算和逻辑与模板/演示分离。当我想做一些事情,比如说,用参数调用一个对象的函数时,这是一个巨大的痛苦。我完全支持好的模板设计,但不要通过破坏模板系统来强迫它,用系统的好设计和关于最佳实践的好文档来鼓励它。哇。我刚刚使用了您关于设置TEMPLATE_DEBUG=False的建议/答案,现在我第一次从Jinja收到了有意义的错误消息!!!我一直在调试我的模板,反复尝试,注释掉,取消注释掉。你的答案需要在网络上更突出的地方,这是一个巨大的帮助!谢谢你的回答。在问我的问题之前,我用加速模块重新编译了jinja2。我正在使用一个用于python的debian包,所以我想我不是在这个例子中。。。我希望如此。如何在其python包中检查Ubuntu使用的ctypes???这个答案对谷歌来说容易吗?我提到了一两个关于使用Django设置Jinja的不同教程,我记得没有看到过。我很高兴终于收到了Jinja的错误消息@Eric你可以选择自己的答案作为你问题的答案。
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