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

The*_*One 4 python jinja2 flask

我的代码中的很多模型都有关系,可以是None.很多时候,这需要None在访问数据之前进行检查:

{% if foo.bar %}
   {{ foo.bar.baz }}
{% endif %}
Run Code Online (Sandbox Code Playgroud)

如果我不添加该检查,则该页面会完全出现UndefinedError.从Flask应用程序运行时,有没有什么方法可以让我在Jinja2中默默地失败UndefinedErrors?

Sea*_*ira 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()
Run Code Online (Sandbox Code Playgroud)