如果我像这样返回Jinja2模板:
return render_response('home.htm', **context)
如何从模板中获取上下文中的变量列表?
答案 0 :(得分:36)
从技术上讲,因为上下文不是作为命名字典传递的,所以需要做一些工作来从模板内部生成上下文变量列表。虽然有可能。
定义Jinja context function以返回jinja2.Context对象,该对象本质上是全局变量/函数的字典
在全局命名空间中使该功能可用;即jinja2.Environment或jinja2.Template全局词典
可选地,从上下文中过滤对象;例如,使用callable()
跳过Jinja的默认全局辅助函数(范围,连接符等)。这可以在上下文函数或模板中完成;无论哪里最有意义。
示例:
>>> import jinja2
>>>
>>> @jinja2.contextfunction
... def get_context(c):
... return c
...
>>> tmpl = """
... {% for key, value in context().items() %}
... {% if not callable(value) %}
... {{ key }}:{{ value }}
... {% endif %}
... {% endfor %}
... """
>>>
>>> template = jinja2.Template(tmpl)
>>> template.globals['context'] = get_context
>>> template.globals['callable'] = callable
>>>
>>> context = {'a': 1, 'b': 2, 'c': 3}
>>>
>>> print(template.render(**context))
a:1
c:3
b:2
[或者,使用render_response
致电('home.htm', context=context)
以使其他解决方案有效。]
答案 1 :(得分:3)
以下是如何从Flask应用中获取@crewbum's answer:
import jinja2
@jinja2.contextfunction
def get_context(c):
return c
app.jinja_env.globals['context'] = get_context
app.jinja_env.globals['callable'] = callable
答案 2 :(得分:0)
我发现@Garrett's answer比我想要的要复杂一些。我发现我可以通过将上下文的克隆添加到上下文本身来轻松检查上下文:
contextCopy = dict(context)
context['all'] = contextCopy
然后使用<pre>{{ all|pprint }}</pre>
将其漂亮地打印到我的Jinja模板中。