Jinja2 игнорирует UndefinedErrors для объектов, которые не найдены - PullRequest
11 голосов
/ 31 мая 2011

Я переключился на Jinja из Django, но многие из моих шаблонов сломались при ссылке на

 {{ entity.property }}

, если сущность не определена.Есть ли возможность игнорировать UndefinedErrors в определенных ситуациях, в противном случае мне придется добавить множество оболочек

 {% if entity %}{{ entity.property }}{% endif %}

.

Спасибо, Ричард

Ответы [ 6 ]

7 голосов
/ 26 марта 2014

Основываясь на превосходном и полезном ответе Шона, я сделал следующее:

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=SilentUndefined), где я это назвал.

В библиотеке django_jinja, которую я использую, вышеприведенное находится в base.py и фактически является модификацией initial_params

4 голосов
/ 17 марта 2016

Мне также нужно было сбросить магические методы класса для корректной работы атрибутов объекта и т. Д. Добавление в @rattray -

from jinja2 import Undefined, Template

class SilentUndefined(Undefined):
    def _fail_with_undefined_error(self, *args, **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, которые по умолчанию молчат.

4 голосов
/ 31 мая 2011

Jinja2 фактически использует специальный класс для неопределенных сущностей. Вы можете создать подкласс этого Undefined класса из Jinja2, чтобы включить __getattr__ и другие атрибуты доступа , которые вы хотите использовать даже на неопределенных объектах, и заставить их возвращать пустой Unicode строка (например).

2 голосов
/ 20 января 2015

Я основывался на ответе @ 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'

Мне нужно было игнорировать ошибки при визуализации шаблона из строки напрямуюиспользования окружающей среды.

1 голос
/ 09 февраля 2018

Также искал решение и использовал класс @ s29 SilentUndefined, но я обнаружил ошибку "объект не может быть вызван", когда пытались вызвать неопределенную переменную, так что это мой обходной путь, это может быть полезнодля кого-то

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
0 голосов
/ 20 июня 2018

Если вы используете Jinja2 в рамках ansible, есть настройка, которая позволяет вам указать поведение по умолчанию для отсутствующей переменной. В ansible.cfg:

[Defaults]
error_on_undefined_vars=False

Обратите внимание, что этот фильтр и фильтр по умолчанию работают, только если отсутствует то, что находится в конце пути точки. Например: {{ a.b.c }} будет работать, если отсутствует «c», но все равно не удастся выполнить KeyError, если отсутствует «b».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...