Ruby的ERB就像python中的功能一样

时间:2016-08-21 11:33:50

标签: python ruby python-2.7

我的配置文件格式为json,格式为yaml。我希望能够使用作为环境变量的值读取这些配置文件。例如:

{"username":"Dan", "password":"<%= ENV['DB_PASSWORD']%>"}

这意味着从环境变量加载json文件时检索密码,并用具体值替换<%= ENV['DB_PASSWORD']%>

注意:1。上面提到的语法就像使用ruby的erb一样仅用于说明        2.我更喜欢原生python的解决方案而不安装新的python包,但如果没有,我也会接受这个。

1 个答案:

答案 0 :(得分:4)

您所寻找的通常称为模板,您基本上已经定义了模板语言

根据您想要做的完全,您可以使用stdlib中的string.Template库。它只做简单的变量替换,而不是ERb,它允许任意代码(包括删除所有数据的代码,格式化硬盘,启动后门,......)。

因此,string.Template 比ERb更强大,但 更安全。您的示例已经证明了这一点,因为您甚至无法从模板中访问环境变量,您必须明确地传递它们。

这是基本用法:

from string import Template

s = Template('{"username": "Dan", "password": "$db_password"}')

s.safe_substitute(db_password = 's00persekrit')
# >>> {"username": "Dan", "password": "s00persekrit"}

由于在模板中无法访问环境变量,因此您必须明确地将它们传递给模板:

from string import Template
from os import environ as env

s = Template('{"username": "Dan", "password": "$db_password"}')

s.safe_substitute(db_password = env['DB_PASSWORD'])
# >>> {"username": "Dan", "password": "s00persekrit"}

实际上,如果您想让模板访问所有环境变量,您应该能够直接传递os.environ dict(您可以传递任何dict - 类似的对象进行映射)。

from string import Template
from os import environ as env

s = Template('{"username": "Dan", "password": "$DB_PASSWORD"}')

s.safe_substitute(env)
# >>> {"username": "Dan", "password": "s00persekrit"}

如果你想要一些更强大的替换,那么你应该看一些其他所谓的“无逻辑”模板语言(即只执行简单替换但不允许执行代码的语言,并且不允许条件或循环)。其中一种语言是Mustache(GitHub使用的模板语言),有许多语言的实现,包括Pystache for Python

如果您需要/需要更多高级功能,例如循环,条件等,您可能需要查找功能更全面的template languages,例如Jinja