【问题标题】:Ruby's ERB like feature in pythonRuby 在 python 中的类似 ERB 的功能
【发布时间】:2016-08-21 11:33:49
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python ruby python-2.7


    【解决方案1】:

    您要查找的通常称为模板,并且您基本上已经定义了一种模板语言

    根据确切您想要做什么,您可以使用标准库中的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-like 对象进行映射)。

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多