簡體   English   中英

從 Jinja2 模板訪問操作系統環境變量

[英]Accessing OS environment variables from Jinja2 template

是否可以直接從 Jinja2 模板訪問操作系統環境變量?

按照@Renier 在評論中關於自定義過濾器的指針,我想出了一個可能的解決方案。

定義一個自定義過濾器

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

我相信您可以像這樣訪問環境變量:

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

這是我最近看到的Docker 部署 ejabberd的配置文件中的一個示例。

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

注意:您可以在 Github 存儲庫的運行文件中查看示例的其余部分。

據我了解,這段代碼完成了繁重的工作:

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}

參考

這里的答案很好用,但您仍然可以擺脫 cat 的無用使用並將其壓縮為單個語句:

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

PS:堆棧溢出不允許在注釋中使用格式化代碼。 因此,我不得不將此作為單獨的答案發布,而不是在https://stackoverflow.com/a/27984610/1070890上發表評論。

在 bash 中,讓我們設置我們的示例

export MYENVVAR=foo

$納米示例.py

from jinja2 import Template
import os
template = Template("Hello {{ env['MYENVVAR'] or 'DefaultVal' }}")
r = template.render(env=os.environ, name='somethingelse')
print(r)

運行模板

    $ python3 example.py

https://jinja.palletsprojects.com/en/2.11.x/intro/

是您可以從模板訪問的變量列表。 我試圖訪問一些app.config變量,我設法通過調用config來做到這一點:

{% if current_user.id == config['ADMIN_ID'] %}
 ######## SOME HTML ########
{% endif %}

Flask-Login 將current_user變量添加到您的模板中

我最簡單的 FastAPI 解決方案

模板.env.globals.update(getenv=os.getenv)

在神社2

{{ getenv("FOO") }}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM