2018年6月23日土曜日
ウズマスター戦記
ウズマスター戦記 https://www.uzumax.org/2018/06/djangodjangotemplatebasevariabledoesnot.html

【Django】django.template.base.VariableDoesNotExist を出力しない

Djangoでテンプレートを製造していると、


  • django.template.base.VariableDoesNotExist:


といういらないログが出てくるんですよ。
これを消す方法です。




コンテキストに値が無い場合に表示される

  • django.template.base.VariableDoesNotExist

このログですが、以下のようにコンテキストに対象のキーが入っていない時に出力されるログです。

view.py

def tagfor(request):
    # 空っぽのコンテキストをビューに渡す
    context = {}

    return render(request, 'tag_samples/tagfor.html', context)

テンプレート

<!-- contextにperson_listというキーが存在しない ⇒ VariableDoesNotExist -->
{% if person_list %}
    {% for person in person_list %}
  • 名前:{{ person.name }},年齢:{{ person.age }}
  • {% endfor %}
{% endif %}

エラーログ

Traceback (most recent call last):
  File "C:\Users\uzu\venv\heibon-django\lib\site-packages\django\template\base.py", line 856, in _resolve_lookup
    (bit, current))  # missing attribute
django.template.base.VariableDoesNotExist: Failed lookup for key [person_list] in [{'True': True, 'False': False, 'None': None}, {'csrf_token': <SimpleLazyObject: <function csrf.<locals>._get_val at 0x0000008751F20730>>, 'request': <WSGIRequest: GET '/t
ag_samples/tagfor'>, 'user': <SimpleLazyObject: <function AuthenticationMiddleware.process_request.<locals>.<lambda> at 0x0000008751F20510>>, 'perms': <django.contrib.auth.context_processors.PermWrapper object at 0x0000008751B18828>, 'messages': <django
.contrib.messages.storage.fallback.FallbackStorage object at 0x0000008751B18940>, 'DEFAULT_MESSAGE_LEVELS': {'DEBUG': 10, 'INFO': 20, 'SUCCESS': 25, 'WARNING': 30, 'ERROR': 40}}, {}, {'block': <Block Node: body. Contents: [<TextNode: '\n\n<!-- contextに
person_lis'>, <IfNode>, <TextNode: '\n\n'>]>}]
[25/Jun/2018 10:15:01] "GET /tag_samples/tagfor HTTP/1.1" 200 238 a

ifタグでは消せない

この事象の厄介な所は、コンテキストに値があるかどうかをifタグで判断する手法が使えないということです。

コンテキストに値があるかどうかをif文で判断することは出来ますが、その場合はifタグからNotExistのログが表示されてしまいますので、ログを消すことには繋がらないのです。

かと言ってダミーで空の値をコンテキストにセットしておくというやり方も美しいとは言えませんよね……。

ログレベルを上げることで対処

結局のところ、実装でこの事象を回避する方法は分かりませんでした。
しかし、このログはdjango.templateからデバッグログとして出力されていますので、ログレベルをINFO以上に上げることでログ上は表示されなくなります

    'loggers': {
        'django.template': {
            'handlers': ['console', 'mail_admins'],
            'level': 'INFO',
        },
    }

理想的な解決方法とは言い難いですが、これしか手は無いと思います。


0 件のコメント:

コメントを投稿

お気軽にコメント下さい。