我正在编写一个用于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扩展的方法。那可行吗?感谢。
答案 0 :(得分:3)
是的,可以使用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
,因为上下文不会包含该模板变量。