python中Ruby的类ERB特性

2024-05-13 03:14:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

注:1。上面提到的语法就像使用ruby的erb只是为了说明 2我更喜欢不安装新python包的原生python解决方案,但如果没有,我也会接受。


Tags: 文件envjson密码yamldb配置文件语法
1条回答
网友
1楼 · 发布于 2024-05-13 03:14:41

您要寻找的通常称为模板化,您基本上定义了一种模板语言。在

根据您想要做什么,您可以使用stdlib中的^{}库。不过,它只做简单的变量替换,与ERb相反,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"}

由于无法在模板内访问环境变量,因此必须将它们显式地传递到模板中:

^{pr2}$

实际上,如果您想让模板访问所有环境变量,您应该能够直接传递os.environdict(您可以为映射传递任何类似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。在

相关问题 更多 >