将Jinja2过滤器应用于每个渲染模板中的每个值

时间:2015-12-01 21:33:42

标签: python json jinja2

我试图创建一个Jinja2环境,只打算在JSON模板上使用它。因此,我想对每个渲染值应用tojson过滤器。我知道每个单独的模板都可以使用filter sections,但我们希望避免这种情况。

有没有办法设置全局过滤器?如果没有,那么下一个最好的事情是自定义加载器是否在加载数据的开头和结尾插入了过滤器部分?

2 个答案:

答案 0 :(得分:0)

在将其传递给Jinja2之前,将递归函数应用于您的上下文字典。

例如,此函数转义dict中的每个字符串,在\之前加特定字符。

def escape_markdown(data):

    if isinstance(data, dict):
        return {key: escape_markdown(val) for key, val in data.items()}
    elif isinstance(data, str):
        return re.sub(r'([\\*_])', r'\\\1', data)
    else:
        return data

答案 1 :(得分:-1)

就个人而言,我使用辅助函数来渲染我的模板,这些模板插入一些方便的变量以及可用于你需要的东西。我理解它并不完全是你所要求的,但希望它仍然有用。

def render_response(self, _template, **context):
    # Renders a template and writes the result to the response.
    import json, time
    context['now']=int(time.time())
    context['anything_you_want']=self.session['something']
    for k in context:
        context[k] = json.dumps(context[k])
    rv = self.jinja2.render_template(_template, **context)
    self.response.write(rv)