Обработка исключений Jinja2

Есть ли способ обработать исключения в шаблоне в jinja2?

{% for item in items %}
   {{ item|urlencode }}  <-- item contains a unicode string that contains a character causes urlencode to throw KeyError
{% endfor %}

Как мне обработать это исключение, чтобы я мог просто пропустить этот элемент или обработать его без принудительного отказа всей рендеринга шаблона?

Спасибо!

Ответ 1

{% for item in items %}
   {{ item | custom_urlencode_filter }}
{% endfor %}

Затем в любом файле вы создаете среду jinja2

def custom_urlencode_filter(value):
    try:
        return urlencode(value)
    except:
        # handle the exception


environment.filters['custom_urlencode_filter'] = custom_urlencode_filter

Подробнее о настраиваемых фильтрах jinja2

Ответ 2

Хотя у jinja2 нет способа справиться с этим по умолчанию, есть обходной путь.

Поскольку try не поддерживается в языке шаблонов, нам нужна вспомогательная функция, определенная в python, например:

 def handle_catch(caller, on_exception):
      try:
           return caller()
      except:
           return on_exception

Этот метод внедряется в шаблонизатор либо через Environment.globals, либо при вызове метода рендеринга. В этом примере он вводится с помощью метода рендеринга.

my_template.render(handle_catch=handle_catch)

В самом шаблоне можно определить макрос:

{% macro catch(on_exception) %}
    {{ handle_catch(caller, on_exception) }}
{% endmacro %}

И это можно использовать как:

{% for item in items %}
   {% call catch('') %}
       {{ item | custom_urlencode_filter }}
   {% endcall %}
{% endfor %}

Примечание:

  • Метод вызывающей стороны предоставляется jinja2, и это функция, которая отображает код между {% call...%} и {% endcall%}
  • on_exception может использоваться для предоставления альтернативного текста в случае исключений, но в этом случае мы просто используем пустую строку.

Ответ 3

Нет. Просто обрабатывайте исключения в функции фильтра urlencode.