如何让Jinja2将所有UndefinedError异常转换为空字符串?

4 投票
1 回答
1423 浏览
提问于 2025-04-17 14:36

我代码里的很多模型都有可能是空的,也就是说它们的关系可能是None。这就意味着在访问这些数据之前,我得先检查一下它们是不是空的:

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

如果我不做这个检查,页面就会因为出现未定义错误(UndefinedError)而完全崩溃。有没有办法在使用Flask应用运行Jinja2时,让未定义错误静默失败,也就是说不让它报错呢?

1 个回答

8

简单来说,你可以创建一个 jinja2.Undefined 的子类,这个子类在访问属性时会返回它自己。然后,通过重写 create_jinja_environment 方法,把这个子类设置为你环境中的 Undefined 类型。

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()

撰写回答