Source code for dynaconf.loaders.env_loader
from os import environ
from dotenv import cli as dotenv_cli
from dynaconf.utils.parse_conf import parse_conf_data
IDENTIFIER = "env"
[docs]def load(obj, env=None, silent=True, key=None):
"""Loads envvars with prefixes:
`DYNACONF_` (default global) or `$(ENVVAR_PREFIX_FOR_DYNACONF)_`
"""
global_env = obj.get("ENVVAR_PREFIX_FOR_DYNACONF")
if global_env is False or 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_ = ""
if env is not False:
env = env.upper()
env_ = "{0}_".format(env)
try:
if key:
value = 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:
trim_len = len(env_)
data = {
key[trim_len:]: parse_conf_data(data, tomlfy=True)
for key, data in 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():
quote_mode = (
isinstance(value, str)
and (value.startswith("'") or value.startswith('"'))
) or isinstance(value, (list, dict))
dotenv_cli.set_key(
str(settings_path),
key,
str(value),
quote_mode="always" if quote_mode else "none",
)