哪个Python模板语言支持从字典填充变量?
我想为一些外部软件生成一个配置文件。这个配置文件需要一些敏感信息,比如AWS的访问密钥和密码等。我希望把这些配置文件放到GitHub上,但显然我不想把这些凭证直接写进去,暴露出来。
这些凭证还必须放在配置文件的正确位置,所以我不能只是把它们简单地加到文件末尾。
我想,使用像jinja2、mako、django这样的模板语言会是个不错的解决方案。这样我就可以把模板放到网上,让用户自己创建一个包含凭证的新文件,然后运行我提供的脚本来生成最终的配置文件。模板引擎还可以让我进行更复杂的编辑(我觉得)。
有没有人能推荐一个特别的模板引擎,让这个过程变得简单?我想要的功能是,先创建一个模板,然后通过提供一个包含变量的字典来生成最终文件。也许所有的模板引擎都能做到这一点,我不太清楚。
更具体一点,我希望有一个能做到这样的功能:
Template("Hello {{name}}, you are #{{num}}").render({"name":"Joe","num":1})
我看到的所有模板都像这样:
Template("Hello {{name}}, you are #{{num}}").render(name="Joe", num=1)
这让编写一个通用程序变得困难,因为它需要读取一个包含键值对的参数文件,然后把这些值传给模板进行渲染。例如,这可能需要使用“eval”,这就显得有些麻烦。
3 个回答
这段话有点主观,但我用的是jinja2和YAML这两个工具。
Jinja2非常灵活,可以进行循环、转义等操作。
YAML很容易编辑,可以转换成Python字典,而这个字典里的值可以用来生成你的模板。
我很高兴发现SaltStack的解决方案默认使用的就是这两个工具——Jinja2和YAML。可能是有很好的理由的。
我觉得你可以用任何模板系统来做到这一点。如果你的参数存放在一个字典里,但模板的接口需要用关键字来传递参数,你可以使用参数解包语法:
my_template.render(**my_parameter_dict)
如果你的模板语言只允许使用 render(a=foo, b=bar)
这种方式,你可以这样变通一下:d = {"a": foo, "b": bar}; render(**d)
—— 这样就不需要用到 eval 了。
想了解更多信息,可以查看 这个链接