Python Jinja2忽略非';找不到
我从Django转用了Jinja,但是我的很多模板在引用时都坏了Python Jinja2忽略非';找不到,python,jinja2,Python,Jinja2,我从Django转用了Jinja,但是我的很多模板在引用时都坏了 {{ entity.property }} 如果未定义实体。在某些情况下,是否可以忽略未定义的错误,否则我将不得不添加大量的错误 {% if entity %}{{ entity.property }}{% endif %} 包装纸 谢谢, RichardJinja2实际上为未定义的实体使用了一个特殊的类。您可以从Jinja2中对该类进行子类化,以包括\uu getattr\uuuu和其他您希望能够在未定义的实体上使用的类
{{ entity.property }}
如果未定义实体。在某些情况下,是否可以忽略未定义的错误,否则我将不得不添加大量的错误
{% if entity %}{{ entity.property }}{% endif %}
包装纸
谢谢,
RichardJinja2实际上为未定义的实体使用了一个特殊的类。您可以从Jinja2中对该类进行子类化,以包括
\uu getattr\uuuu
和其他您希望能够在未定义的实体上使用的类,并让它们返回一个空的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
然后env=Environment(undefined=silentindefined)
我在这里调用它
在我使用的django_jinja库中,上述内容位于
base.py
中,实际上是对初始参数的修改
我基于@rattray的上述答案:
from jinja2 import Undefined, Template
class SilentUndefined(Undefined):
def _fail_with_undefined_error(self, *args, **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'
当直接从字符串而不是使用环境呈现模板时,我需要忽略错误。我还需要重置类的神奇方法,以使对象属性等正常工作。添加到@rattray--
作为一个金贾的环境是有意义的。很多人可能来自django模板,默认情况下这些模板是无声的。也在寻找解决方案,并使用了@s29 SilentUndefined类,但我在尝试调用undefined变量时发现了“'str'object is not callable”错误,所以这是我的解决方法,可能对某些人有所帮助
class SilentUndefined(Undefined):
def _fail_with_undefined_error(self, *args, **kwargs):
class EmptyString(str):
def __call__(self, *args, **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
请注意,只有在点路径的末尾缺少内容时,此过滤器和默认过滤器才起作用。例如:
{{a.b.c}
在缺少“c”时可以工作,但如果缺少“b”时仍然会失败并出现一个键错误。相关:\uuuu getattr\uuuu
在未定义的,如果该值是空字符串。@wvxvw-关键是您可以创建一个未定义的子类,该子类将为每个属性访问器返回自身,但\uuuuuuuunicode\uuuuuuuuu>/\uuuuuuuu str\uuuuuuuuuu
除外-当强制为字符串时,它将返回空字符串'
。我的意思不是说你可以把索引变成一个绑定的Jinja变量,而这个变量恰好是一个空字符串。这有意义吗?这是唯一对我有效的SilentUndefined变体
[Defaults]
error_on_undefined_vars=False