[英]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
這是您可以從模板訪問的變量列表。 我試圖訪問一些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.