【问题标题】:how to get list of all variables in jinja 2 template file如何获取 jinja 2 模板文件中所有变量的列表
【发布时间】:2021-01-31 15:17:12
【问题描述】:

我有一个用例,我想在 jinja2 模板中获取未引用变量的列表。 我在stackoverflow上找到了一些关于如何做到这一点的解释,但这些例子中没有一个使用文件作为模板,我非常非常卡住

这是我的代码。第 8 行和第 9 行可以省略,ofc。

import jinja2
from jinja2 import meta


env = jinja2.Environment(loader=jinja2.FileSystemLoader(searchpath="./"))
template_file = "testfile.txt"
template = env.get_template(template_file)
data = dict(foo='foo', bar='bar')
print(template.render(data))


data = dict(foo='foo')
test = env.parse(data, template)
print(meta.find_undeclared_variables(test))

这里是'testfile.txt'的内容

this should print foo:{{foo}}
this should print bar:{{bar}}

这是我的输出

this should print foo:foo
this should print bar:bar

set()

我想得到的输出是集合中的字符串“bar” 如下所示,因为 'data' 字典中没有引用 'bar'。

this should print foo:foo
this should print bar:bar

set('bar')

任何解决此问题的帮助将不胜感激

【问题讨论】:

标签: python jinja2


【解决方案1】:

首先我想澄清一下,jinja 认为变量是通过Environment 类的实例属性global 分配的变量。 global 属性是一个字典,其中包含我们将在模板中使用的变量。

import jinja2
from jinja2 import meta


env = jinja2.Environment(loader=jinja2.FileSystemLoader(searchpath="./"))

# Declare foo, but no bar
env.globals['foo'] = 'foo'

# Load the template as a file and read it
with open("testfile.txt") as file:
    ast = env.parse(file.read())

# Find the undeclared variables of our template loaded with an environment that
# only has 'foo' declared in it `globals` attr.
undeclared_variables = meta.find_undeclared_variables(ast)

print(undeclared_variables)

结果:

{'bar'}

【讨论】:

  • 嗨卢卡斯,非常感谢。这完全回答了我的问题!
  • 为了操作的完整性,我想补充一点,您可以省略加载程序,只需执行 env = jinja2.Environment()
猜你喜欢
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
相关资源
最近更新 更多