如何从Jinja 2模板获取当前变量列表?

Chr*_*ian 24 templates jinja2

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

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

Gar*_*ett 36

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

  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
Run Code Online (Sandbox Code Playgroud)

[或者,调用render_response('home.htm', context=context)使其他的解决方案工作.]

  • 非常感谢.我向你优越的Jinja2知识低头. (4认同)
  • 请注意,由于“可调用”检查,您的解决方案将忽略已作为上下文的一部分显式传递的函数。可能不会经常发生,但可能会产生影响。 (2认同)