コード内の多くのモデルには、None になるリレーションがあります。多くNone
の場合、データにアクセスする前に次のチェックが必要です。
{% if foo.bar %}
{{ foo.bar.baz }}
{% endif %}
そのチェックを追加しないと、UndefinedError でページが完全に壊れてしまいます。Flask アプリから実行したときに、Jinja2 の UndefinedErrors でサイレントに失敗する方法はありますか?
属性アクセスでそれ自体を返すサブクラスを作成し、メソッドjinja2.Undefined
をオーバーライドして、環境の未定義タイプとして設定するだけです。create_jinja_environment
from flask import Flask
from jinja2 import Undefined
from werkzeug.datastructures import ImmutableDict
class MalleableUndefined(Undefined):
def __getitem__(self, key):
return self
def __getattr__(self, key):
return self
class CustomFlask(Flask):
def create_jinja_environment(self):
self.jinja_options = ImmutableDict(undefined=MalleableUndefined, **self.jinja_options)
return super(CustomFlask, self).create_jinja_environment()