从Jinja2模板访问OS环境变量

时间:2014-09-16 06:35:44

标签: python jinja2

是否可以直接从Jinja2模板访问OS环境变量?

3 个答案:

答案 0 :(得分:8)

按照@ Renier关于评论中自定义过滤器的指针,我找到了一个可能的解决方案。

定义custom filter

def env_override(value, key):
  return os.getenv(key, value)

在环境中安装过滤器:

env.filters['env_override'] = env_override

按如下方式使用过滤器:

"test" : {{ "default" | env_override('CUSTOM') }}

适当的环境变量可以设置为:

export CUSTOM=some_value

如果设置了环境变量,则输出将为:

"test" : some_value

否则:

"test" : default

答案 1 :(得分:8)

https://stackoverflow.com/a/27984610/1070890中的答案很有效但你仍然可以摆脱对猫的无用使用并将其压缩成一个声明:

python -c 'import os
import sys
import jinja2
sys.stdout.write(
    jinja2.Template(sys.stdin.read()
).render(env=os.environ))' <$CONFIGTEMPLATE >$CONFIGFILE

P.S。:Stack Overflow不允许在评论中使用格式化代码。因此,我必须将此作为单独的答案发布,而不是评论https://stackoverflow.com/a/27984610/1070890

答案 2 :(得分:6)

我相信你可以像这样访问环境变量:

{{ env['XMPP_DOMAIN'] or "localhost" }}

这是我最近看到的Docker deployment of ejabberd配置文件中的一个示例。

hosts:
  - "{{ env['XMPP_DOMAIN'] or "localhost" }}"

注意:您可以在Github存储库的run文件中看到该示例的其余部分。

据我所知,重要的事情是通过这段代码完成的:

readonly PYTHON_JINJA2="import os;
import sys;
import jinja2;
sys.stdout.write(
    jinja2.Template
        (sys.stdin.read()
    ).render(env=os.environ))
"""

此代码用于生成模板文件:

cat ${CONFIGTEMPLATE} \
      | python -c "${PYTHON_JINJA2}" \
      > ${CONFIGFILE}

参考