Source code for dynaconf.loaders.env_loader
# coding: utf-8
import os
from dynaconf.utils.parse_conf import parse_conf_data
from dotenv import cli as dotenv_cli
IDENTIFIER = 'env'
[docs]def load(obj, env=None, silent=True, key=None):
"""Loads envvars with prefixes:
`DYNACONF_` (default global) or `$(GLOBAL_ENV_FOR_DYNACONF)_`
"""
global_env = obj.get('GLOBAL_ENV_FOR_DYNACONF')
if global_env.upper() != 'DYNACONF':
load_from_env(
IDENTIFIER + '_global',
key,
'DYNACONF',
obj,
silent
)
# Load the global env if exists and overwrite everything
load_from_env(
IDENTIFIER + '_global',
key,
global_env,
obj,
silent
)
[docs]def load_from_env(identifier, key, env, obj, silent):
env = env.upper() # noqa
env_ = '{0}_'.format(env) # noqa
try:
if key:
value = os.environ.get(
'{0}_{1}'.format(env, key)
)
if value:
obj.logger.debug(
"env_loader: loading by key: %s:%s (%s:%s)",
key,
value,
identifier,
env
)
obj.set(key, value, loader_identifier=identifier, tomlfy=True)
else:
data = {
key.partition(env_)[-1]: parse_conf_data(data, tomlfy=True)
for key, data
in os.environ.items()
if key.startswith(env_)
}
if data:
obj.logger.debug(
"env_loader: loading: %s (%s:%s)",
data,
identifier,
env
)
obj.update(data, loader_identifier=identifier)
except Exception as e: # pragma: no cover
e.message = (
'env_loader: Error ({0})'
).format(str(e))
if silent:
obj.logger.error(str(e))
else:
raise
[docs]def write(settings_path, settings_data, **kwargs):
"""Write data to .env file"""
for key, value in settings_data.items():
dotenv_cli.set_key(
str(settings_path),
key.upper(),
str(value)
)