Jav*_*aSa 4 ruby python python-2.7
我已经将一些配置文件json格式化为yaml。我希望能够读取带有环境变量值的那些配置文件。例如:
{"username":"Dan", "password":"<%= ENV['DB_PASSWORD']%>"}
Run Code Online (Sandbox Code Playgroud)
这意味着从环境变量加载json文件时检索密码,并<%= ENV['DB_PASSWORD']%>用具体值替换。
注意事项:1。上面提到的语法就像仅将红宝石的erb用于插图2。我更喜欢本机python的解决方案,而无需安装新的python包,但是如果没有这样的话,我也会接受。
您所寻找的通常称为模板化,并且您基本上已经定义了一种模板语言。
根据什么确切你想做的事,你可以使用string.Template从STDLIB库。但是,它只进行简单的变量替换,而不是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"}
Run Code Online (Sandbox Code Playgroud)
由于无法在模板内部访问环境变量,因此您必须将它们明确传递给模板:
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"}
Run Code Online (Sandbox Code Playgroud)
实际上,如果您想让模板访问所有环境变量,则应该能够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"}
Run Code Online (Sandbox Code Playgroud)
如果您想进行更强大的替换,则应查看其他一些所谓的“无逻辑”模板语言(即仅执行简单替换但不允许执行代码且不允许条件或循环的语言) 。其中的一种语言是Mustache(GitHub使用的模板语言),有许多语言的实现,包括Pystache for Python。
如果您希望/需要更高级的功能(例如循环,条件等),则可能需要寻找更全功能的模板语言(例如Jinja)。
| 归档时间: |
|
| 查看次数: |
2219 次 |
| 最近记录: |