如何定制jinja2标签与烧瓶请求的上下文接口

时间:2015-03-31 20:59:26

标签: python flask jinja2 contextmanager

我正在编写一个用于flask应用程序的自定义jinja2 extension,我正在寻找一种使用我正在实现的标记访问模板上下文数据的方法。也就是说,我希望扩展标记使用传递给模板的上下文参数:

@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扩展的方法。那可行吗?感谢。

1 个答案:

答案 0 :(得分:3)

ContextReference

是的,可以使用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,因为上下文不会包含该模板变量。