【问题标题】:Apply Jinja2 filter to every value in every rendered template将 Jinja2 过滤器应用于每个渲染模板中的每个值
【发布时间】:2016-03-05 23:28:34
【问题描述】:

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

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

【问题讨论】:

  • tojson 过滤器实际上来自 Flask,但您自己的实现相当容易。
  • 过滤器部分也适用于整个文本,而不仅仅是替换的值。所以这无助于实现我的目标。

标签: python json jinja2


【解决方案1】:

将递归函数应用于上下文字典,然后再将其传递给 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

【讨论】:

    【解决方案2】:

    就我个人而言,我使用一个辅助函数来呈现我的模板,它插入了一些方便的变量以及可用于您需要的东西。我知道这不是您所要求的,但希望它仍然有用。

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-03
      • 2011-11-07
      • 1970-01-01
      • 2020-02-26
      • 1970-01-01
      • 2017-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多