Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Jinja2忽略非';找不到_Python_Jinja2 - Fatal编程技术网

Python Jinja2忽略非';找不到

Python Jinja2忽略非';找不到,python,jinja2,Python,Jinja2,我从Django转用了Jinja,但是我的很多模板在引用时都坏了 {{ entity.property }} 如果未定义实体。在某些情况下,是否可以忽略未定义的错误,否则我将不得不添加大量的错误 {% if entity %}{{ entity.property }}{% endif %} 包装纸 谢谢, RichardJinja2实际上为未定义的实体使用了一个特殊的类。您可以从Jinja2中对该类进行子类化,以包括\uu getattr\uuuu和其他您希望能够在未定义的实体上使用的类

我从Django转用了Jinja,但是我的很多模板在引用时都坏了

 {{ entity.property }}
如果未定义实体。在某些情况下,是否可以忽略未定义的错误,否则我将不得不添加大量的错误

 {% if entity %}{{ entity.property }}{% endif %}
包装纸

谢谢,
Richard

Jinja2实际上为未定义的实体使用了一个特殊的类。您可以从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