web-dev-qa-db-ja.com

Jinja2テンプレートをデバッグする方法は?

Jinja2テンプレートシステムをDjangoに使用しています。それは本当に速いです、そして私はそれがとても好きです。それにもかかわらず、テンプレートのデバッグにいくつかの問題があります。テンプレートにいくつかのエラー(不正なタグ、不正なフィルター名、不正なブロックの終わりなど)を作成すると、このエラーに関する情報がまったくありません。

たとえば、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()が定義されていません」のようなものを期待していましたが、単純な黒地に白のトレースバックしかありませんでした(通常の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テンプレート内のどこにエラーがあるかを見つけるにはどうすればよいですか?

前もって感謝します、

26
Eric

さらにいくつかのテストを行った後、私は答えを見つけました:

Djangoを使用せずに、Pythonの直下で同じテンプレートテストを実行すると、デバッグメッセージが表示されます。つまり、Djangoから来ています。

修正はsettings.pyにあります。DEBUGをTrueに設定し、TEMPLATE_DEBUGをFalseに設定する必要があります。

17
Eric

Jinja2ドキュメントから:

私のトレースバックは奇妙に見えます。何が起こっているのですか?

スピードアップモジュールがコンパイルされておらず、ctypesなしでPythonインストールを使用している場合(ctypesなしのPython 2.4、Jython、またはGoogleのAppEngine)Jinja2は正しいデバッグ情報を提供できず、トレースバックが不完全である可能性があります.ctypesが利用できず、スピードアップ拡張機能を使用できないため、現在JythonまたはAppEngineの適切な回避策はありません。

http://jinja.pocoo.org/2/documentation/faq#my-tracebacks-look-weird-what-s-happening

7
Travis Bradshaw