如何解决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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。