Jinja2异常处理

2024-05-05 00:35:41 发布

您现在位置:Python中文网/ 问答频道 /正文

jinja2中是否有方法处理模板内的异常?

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

如何处理该异常,以便跳过该项或在不强制整个模板呈现失败的情况下处理它?

谢谢!


Tags: to方法in模板jinja2forstringthat
3条回答

没有。只需处理urlencode过滤器函数中的异常。

{% 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

关于custom jinja2 filters的更多信息

虽然jinja2在默认情况下没有办法处理这个问题,但是有一个解决方法。

由于模板语言不支持try,我们需要在python中定义一个helper函数,如下所示:

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

此方法通过Environment.globals或在调用render方法时注入模板引擎。在本例中,它是通过render方法注入的。

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可用于在出现异常时提供替代文本,但在这种情况下,我们只使用空字符串。

相关问题 更多 >