4

コード内の多くのモデルには、None になるリレーションがあります。多くNoneの場合、データにアクセスする前に次のチェックが必要です。

{% if foo.bar %}
   {{ foo.bar.baz }}
{% endif %}

そのチェックを追加しないと、UndefinedError でページが完全に壊れてしまいます。Flask アプリから実行したときに、Jinja2 の UndefinedErrors でサイレントに失敗する方法はありますか?

4

1 に答える 1

8

属性アクセスでそれ自体を返すサブクラスを作成し、メソッド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()
于 2013-02-08T02:31:22.183 に答える