【发布时间】:2010-08-03 17:02:46
【问题描述】:
如果我像这样返回 Jinja2 模板:
return render_response('home.htm', **context)
然后如何从模板中获取上下文中的变量列表?
【问题讨论】:
-
阅读模板源码怎么样?这有什么问题?
如果我像这样返回 Jinja2 模板:
return render_response('home.htm', **context)
然后如何从模板中获取上下文中的变量列表?
【问题讨论】:
从技术上讲,因为上下文不是作为命名字典传递的,所以需要做一些工作来从模板内部生成上下文变量的列表。不过有可能。
定义一个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
[或者,使用('home.htm', context=context) 调用render_response 以使其他解决方案起作用。]
【讨论】:
callable 检查,您的解决方案将忽略已作为上下文的一部分显式传递的函数。可能不会经常发生,但可能会有所作为。
template 是一个全局的,get_context() 可以返回一个基于context 但没有template.globals 中也存在的键的新字典。
下面是如何让 @crewbum's answer 在 Flask 应用程序中工作:
import jinja2
@jinja2.contextfunction
def get_context(c):
return c
app.jinja_env.globals['context'] = get_context
app.jinja_env.globals['callable'] = callable
【讨论】:
我发现@Garrett's answer 比我想要的要复杂一些。我发现我可以通过将上下文的克隆添加到上下文本身来轻松地检查上下文:
contextCopy = dict(context)
context['all'] = contextCopy
然后使用 <pre>{{ all|pprint }}</pre> 将其漂亮地打印到我的 Jinja 模板中。
【讨论】: