Jinja2 Exception Handling

后端 未结 3 1384
误落风尘
误落风尘 2020-12-31 08:31

Is there a way to handle exceptions within a template in jinja2?

{% for item in items %}
   {{ item|urlencode }}  <-- item contains a unicode string that          


        
相关标签:
3条回答
  • 2020-12-31 08:49

    While jinja2 does not have a way to handle this by default, there is a workaround.

    Since try is not supported in the template language, we need a helper function defined in Ppython, like this:

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

    This method is injected into the template engine, either via the Environment.globals or when calling the render method. In this example it is injected via the render method.

    my_template.render(handle_catch=handle_catch)
    

    In the template itself it is then possible to define a macro:

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

    And this can then be used as:

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

    Notes:

    • The caller method is provided by the jinja2, and this is a function that renders the code between {% call ... %} and {% endcall %}
    • on_exception can be used to provide an alternative text in case of exceptions, but in this case we just use an empty string.
    0 讨论(0)
  • 2020-12-31 08:56

    There's none. Just handle the exceptions within the urlencode filter function.

    0 讨论(0)
  • 2020-12-31 09:01
    {% for item in items %}
       {{ item | custom_urlencode_filter }}
    {% endfor %}
    

    Then in whatever file you have setting up your jinja2 environment

    def custom_urlencode_filter(value):
        try:
            return urlencode(value)
        except:
            # handle the exception
    
    
    environment.filters['custom_urlencode_filter'] = custom_urlencode_filter
    

    More on custom jinja2 filters

    0 讨论(0)
提交回复
热议问题