27

如果我像这样返回 Jinja2 模板: return render_response('home.htm', **context)

那么如何从模板中获取上下文中的变量列表?

4

3 回答 3

37

从技术上讲,因为上下文不是作为命名字典传递的,所以需要做一些工作来从模板内部生成上下文变量的列表。这是可能的。

  1. 定义一个Jinja 上下文函数来返回 jinja2.Context 对象,它本质上是一个全局变量/函数的字典

  2. 使该函数在全局命名空间中可用;即 jinja2.Environment 或 jinja2.Template 全局字典

  3. 可选地,从上下文中过滤对象;例如,用于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_responsewith('home.htm', context=context)以使其他解决方案起作用。]

于 2010-08-11T23:35:30.377 回答
3

以下是如何从 Flask 应用程序中获取@crewbum 的答案:

import jinja2

@jinja2.contextfunction
def get_context(c):
    return c

app.jinja_env.globals['context'] = get_context
app.jinja_env.globals['callable'] = callable
于 2012-12-07T05:18:59.180 回答
1

我发现@Garrett 的答案比我想要的要复杂一些。我发现我可以通过将上下文的克隆添加到上下文本身来轻松地检查上下文:

contextCopy = dict(context)
context['all'] = contextCopy

然后将其漂亮地打印到我的 Jinja 模板中<pre>{{ all|pprint }}</pre>

于 2019-11-25T14:30:33.130 回答