从Jinja2模板访问OS环境变量

Rob*_*loi 12 python jinja2

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

Rob*_*loi 9

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

定义自定义过滤器:

def env_override(value, key):
  return os.getenv(key, value)
Run Code Online (Sandbox Code Playgroud)

在环境中安装过滤器:

env.filters['env_override'] = env_override
Run Code Online (Sandbox Code Playgroud)

使用过滤器如下:

"test" : {{ "default" | env_override('CUSTOM') }}
Run Code Online (Sandbox Code Playgroud)

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

export CUSTOM=some_value
Run Code Online (Sandbox Code Playgroud)

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

"test" : some_value
Run Code Online (Sandbox Code Playgroud)

除此以外:

"test" : default
Run Code Online (Sandbox Code Playgroud)


Fab*_*ann 9

/sf/answers/1958922731/中的答案非常有效,但您仍然可以摆脱对cat的无用使用并将其压缩为单个语句:

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

PS:Stack Overflow不允许在评论中使用格式化代码.因此,我不得不将此作为单独的答案发布,而不是评论/sf/answers/1958922731/.


slm*_*slm 7

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

{{ env['XMPP_DOMAIN'] or "localhost" }}
Run Code Online (Sandbox Code Playgroud)

这是我最近在ejabberd的Docker部署中看到的配置文件中的一个示例.

hosts:
  - "{{ env['XMPP_DOMAIN'] or "localhost" }}"
Run Code Online (Sandbox Code Playgroud)

注意:您可以从Github仓库中查看运行文件中的其余示例.

据我所知,繁重的工作是通过以下代码完成的:

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

这段代码用于生成模板文件:

cat ${CONFIGTEMPLATE} \
      | python -c "${PYTHON_JINJA2}" \
      > ${CONFIGFILE}
Run Code Online (Sandbox Code Playgroud)

参考

  • 这给了我`jinja2.exceptions.UndefinedError:'env'未定义` (3认同)