Jinja2忽略未找到对象的UndefinedErrors

问题描述

|| 我从Django切换到Jinja,但是引用时很多模板都坏了
 {{ entity.property }}
如果未定义实体。在某些情况下是否可以忽略UndefinedErrors,否则我将不得不添加很多
 {% if entity %}{{ entity.property }}{% endif %}
包装纸。 谢谢, 理查德     

解决方法

        Jinja2实际上对未定义的实体使用特殊的类。您可以从Jinja2继承此
Undefined
类,以包括
__getattr__
和其他即使在未定义实体上也要使用的属性访问器,并使它们返回空白的unicode字符串(例如)。     ,        基于Sean出色而有用的答案,我做了以下工作:
from jinja2 import Undefined
import logging

class SilentUndefined(Undefined):
    \'\'\'
    Dont break pageloads because vars arent there!
    \'\'\'
    def _fail_with_undefined_error(self,*args,**kwargs):
        logging.exception(\'JINJA2: something was undefined!\')
        return None
然后是我叫ѭ5的地方。 在我使用的django_jinja库中,以上内容位于
base.py
中,实际上是对
initial_params
的修改     ,        我还需要重置类的魔术方法,以使对象属性等正常工作。添加到@rattray-
from jinja2 import Undefined,Template

class SilentUndefined(Undefined):
    def _fail_with_undefined_error(self,**kwargs):
        return \'\'

    __add__ = __radd__ = __mul__ = __rmul__ = __div__ = __rdiv__ = \\
        __truediv__ = __rtruediv__ = __floordiv__ = __rfloordiv__ = \\
        __mod__ = __rmod__ = __pos__ = __neg__ = __call__ = \\
        __getitem__ = __lt__ = __le__ = __gt__ = __ge__ = __int__ = \\
        __float__ = __complex__ = __pow__ = __rpow__ = \\
        _fail_with_undefined_error        
成为神社设置是有意义的。 django模板会带来很多人,这些模板默认情况下是静默的。     ,        我建立在上面@rattray的答案上:
from jinja2 import Undefined,**kwargs):
        return \'\'
然后将其与模板字符串一起使用:
person_dict = {\'first_name\': \'Frank\',\'last_name\': \'Hervert\'}
t2 = Template(\"{{ person1.last_name }},{{ person.last_name }}\",undefined=SilentUndefined)

print t2.render({\'person\': person_dict})                                                                         
# \',Hervert\'
直接从字符串而不是使用环境渲染模板时,需要忽略这些错误。     ,        也正在寻找解决方案,并使用了@ s29 SilentUndefined类,但是在尝试调用未定义变量时,我捕捉到了“ \'str \'对象不可调用”错误,所以这是我的解决方法,它可能是对某人有帮助
class SilentUndefined(Undefined):

    def _fail_with_undefined_error(self,**kwargs):
        class EmptyString(str):
            def __call__(self,**kwargs):
                return \'\'
        return EmptyString()

 __add__ = __radd__ = __mul__ = __rmul__ = __div__ = __rdiv__ = \\
    __truediv__ = __rtruediv__ = __floordiv__ = __rfloordiv__ = \\
    __mod__ = __rmod__ = __pos__ = __neg__ = __call__ = \\
    __getitem__ = __lt__ = __le__ = __gt__ = __ge__ = __int__ = \\
    __float__ = __complex__ = __pow__ = __rpow__ = \\
    _fail_with_undefined_error
    ,        如果您在ansible中使用Jinja2,则可以通过一项设置为缺失的变量指定默认行为。在ansible.cfg中:
[Defaults]
error_on_undefined_vars=False
请注意,这和默认过滤器仅在点路径的末尾缺少的情况下有效。例如:如果缺少\'c \',
{{ a.b.c }}
将起作用,但是如果缺少\'b \',则仍会失败并出现KeyError。