自定义 jinja2 标签如何与烧瓶请求的上下文交互

How can a custom jinja2 tag interface with the context of a flask request

我正在编写自定义 jinja2 extension 以在 flask 应用程序中使用,并且我正在寻找一种方法来使用我正在实施的标记来访问模板上下文数据。也就是说,我希望扩展标签使用传入模板的上下文参数:

@app.route('/users/<user_id>')
def user_page(user_id):
    ...
    return render_template('users/index.html', user_id=user_id, active=True)

模板:

<!-- I want this tag to see the value of user_id and active -->
{% my_jinja2_tag %}

我知道我可以使用 {{ user_id }} 呈现上下文变量,但我正在寻找一种方法来检查呈现自定义 jinja2 扩展的模板的上下文。那可行吗?谢谢。

上下文参考

是的,可以使用 jinja2.nodes.ContextReference()。请参阅 API 参考文献 here

放心,我会指导您完成它。 :)

首先是扩展名:

class ActiveCheckerExtension(jinja2.ext.Extension):
    """
    This will give us a {% check_active %} tag.
    """

    template = 'Active is : %s'
    tags = set(['check_active'])

    def _render_tag(self, context, caller):
        return jinja2.Markup(self.template % unicode(context['active']))

    def parse(self, parser):
        ctx_ref = jinja2.nodes.ContextReference()
        lineno = next(parser.stream).lineno
        node = self.call_method('_render_tag', [ctx_ref], lineno=lineno)
        return jinja2.nodes.CallBlock(node, [], [], [], lineno=lineno)

那我们把它添加到Flask的jinja2中吧。

app.jinja_env.add_extension(ActiveCheckerExtension)

现在在您的模板中,您可以:

{% check_active %}

确保在您添加标签的所有模板中都定义了 active,否则您会得到一个 KeyError,因为上下文不会有该模板变量。