Accessing Os Environment Variables From Jinja2 Template
Solution 1:
Following @Renier's pointer about custom filters in the comments, I figured out a possible solution.
Define a custom filter:
def env_override(value, key):
returnos.getenv(key, value)
Install the filter in the environment:
env.filters['env_override'] = env_override
Use the filter as follows:
"test" : {{ "default" | env_override('CUSTOM') }}
Where the appropriate environment variable can be set as:
export CUSTOM=some_value
If the environment variable is set the output will be:
"test" : some_value
Otherwise:
"test" : default
Solution 2:
I believe you can access environment variables like so:
{{ env['XMPP_DOMAIN'] or "localhost" }}
This is from an example in a config file that I saw recently for a Docker deployment of ejabberd.
hosts:
- "{{ env['XMPP_DOMAIN'] or "localhost" }}"
NOTE: You can see the rest of the example in the run file from the Github repo.
As I understand things the heavy lifting is done by this bit of code:
readonly PYTHON_JINJA2="import os;
import sys;
import jinja2;
sys.stdout.write(
jinja2.Template
(sys.stdin.read()
).render(env=os.environ))
"""
And this code is what is used to generate a template file:
cat${CONFIGTEMPLATE} \
| python -c "${PYTHON_JINJA2}" \
> ${CONFIGFILE}
References
Solution 3:
The answer here works beautifully but you can still get rid of the useless use of cat and compress it to a single statement:
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 does not allow formatted code in comments. Therefore I had to post this as a separate answer instead of commenting on https://stackoverflow.com/a/27984610/1070890.
Solution 4:
In bash let's setup our example
export MYENVVAR=foo
$ nano example.py
from jinja2 import Template
import os
template = Template("Hello {{ env['MYENVVAR'] or 'DefaultVal' }}")
r = template.render(env=os.environ, name='somethingelse')
print(r)
Run template
$ python3 example.py
Solution 5:
Here is a list of variables that you can access from your template.
I was trying to access some app.config
variables and I managed to do it by calling config
:
{% if current_user.id == config['ADMIN_ID'] %}
######## SOME HTML ########
{% endif %}
Flask-Login adds the current_user
variable to your templates
Post a Comment for "Accessing Os Environment Variables From Jinja2 Template"