Обработка исключений 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.