def non_dev_check(_config: Dynaconf): requireds = ( 'SMTP.SERVER', 'SMTP.NOREPLY', 'SMTP.NOREPLY_PASSWORD', ) for req in requireds: if _config.get(req) is None: raise ValidationError( f'{req} are required in env {_config["ENV"]}') if _config['JWT']['SECRET'] == DEFAULT_SECRET: raise ValidationError(f'Use default secret in env {_config["ENV"]}') _config['DEBUG'] = False _config['TESTING'] = False
def __merge_secrets(config: Union[Dynaconf, DynaBox], src_config: Dynaconf = None): if src_config is None: src_config = config for key, val in config.items(): if isinstance(val, dict): __merge_secrets(val, src_config) continue # NOTE value must be an exact match to avoid interfering # with other templates if isinstance(val, str) and (val[0:2] == "${" and val[-1] == "}"): ref_key = val[2:-1] ref_val = src_config.get(ref_key, None) if ref_val is not None: config[key] = ref_val continue
def load_configuration(env: Optional[APP_ENV] = None) -> Configuration: if not env: env = cast(APP_ENV, os.getenv("ENV_FOR_DYNACONF", "development")) settings = Dynaconf( settings_files=["default.yaml", f"{env}.yaml", ".secrets.yaml"], load_dotenv=True, merge_enabled=True, root_path=str(PROJECT_ROOT / "config"), envvar_prefix="FASTAPI_BACKEND", ) config_dict = {"environment": env} for key in Configuration.__fields__.keys(): if settings.get(key) is not None: config_dict[key] = settings[key] config = Configuration(**config_dict) return config
from __future__ import annotations from dynaconf import Dynaconf settings = Dynaconf( settings_file="settings.yaml", environments=True, ) print(settings.current_env) print(settings._loaded_by_loaders) assert (settings.get( "www.google.com", dotted_lookup=False) == "data"), settings.get("www.google.com") assert settings.as_dict() == {"WWW.GOOGLE.COM": "data"}, settings.as_dict()
env="ANSIBLE", # Initial env/mode ) app = FastAPI() @app.get("/settings") def read_root(): return settings @app.get("/settings/{setting_name}") def read_item(setting_name: str): return {setting_name: settings.setting_name} if settings.current_env == "ANSIBLE": # this is the initial default assert settings.data_folder == "ansible/.teflo" if settings.current_env == "PUPPET": # only when TEFLO_MODE=puppet assert settings.data_folder == "puppet/.teflo" assert settings.log_level == "info" # might be exported TEFLO_DEBUG_MODE assert settings.workspace == "." print(settings.data_folder) print(settings["log_remove"]) print(settings.get("verbosity")) print(settings.LOG_LEVEL)
from __future__ import annotations import yaml from dynaconf import Dynaconf settings = Dynaconf( settings_file="settings.yaml", environments=True, DOTTED_LOOKUP=False ) assert settings.get("www.google.com") == "data", settings.get("www.google.com") assert settings.as_dict() == {"WWW.GOOGLE.COM": "data"}, settings.as_dict()
else: settings_files = [] if user_settings_file.is_file(): settings_files.append(str(user_settings_file)) settings = Dynaconf( envvar_prefix="CODELAB", # envvar_prefix False 将获取所有环境变量 # envvar_prefix=False, # https://www.dynaconf.com/envvars/#custom-prefix # 'settings.py', # 'settings.toml' '.secrets.toml' settings_files=settings_files, # todo ~/codelab_adapter/user_settings.py ) # 按顺序加载, .local if not settings.get("ZMQ_LOOP_TIME"): # export CODELAB_ZMQ_LOOP_TIME = 0.01 settings.ZMQ_LOOP_TIME = 0.02 if not settings.get("ADAPTER_HOME_PATH"): # 环境 settings.ADAPTER_HOME_PATH = str(pathlib.Path.home() / "codelab_adapter") sys.path.insert(1, settings.ADAPTER_HOME_PATH) # CN_PIP MIRRORS if not settings.get("USE_CN_PIP_MIRRORS"): settings.USE_CN_PIP_MIRRORS = False # may be overwriten by user settings if is_in_china(): settings.USE_CN_PIP_MIRRORS = True if not settings.get("CN_PIP_MIRRORS_HOST"):
from pathlib import Path paths = environ.get("CONFIG_PATH", "").split(";") settings_files = ["default_settings.toml", 'settings.toml', '.secrets.toml'] if paths != [""]: settings_files.extend(paths) settings = Dynaconf( envvar_prefix="DYNACONF", settings_files=settings_files, ) for key in ("common", "schedule", "rss_feeds", "youtube_feeds", "vk_feeds", "tokens", "unique_commands", "stickers", "links", "eggs"): value = settings.get(key, default=None) if isinstance(value, dict) \ and key not in ("unique_commands", "stickers", "eggs"): for _ in value: globals()[_.upper()] = value[_] else: globals()[key.upper()] = value TOKEN = environ.get("TOKEN", None) or TOKEN # noqa DB_PATH = environ.get("DB_PATH", None) or DB_PATH # noqa BASE_DIR = Path(__file__).parent.parent.parent LOCALES_DIR = BASE_DIR / "locales"
from dynaconf import Dynaconf settings = Dynaconf( settings_file="settings.toml", environments=True, # merge_enabled=True # this enabled global merge of all files ) print(settings.A) assert settings.get("A").get("B").get("C") == "1" assert settings.get("A").get("cousin").get("D") == "2"
settings_files = ["settings.toml", "other.toml"] settings = Dynaconf(settings_files=settings_files) expected_value = "s3a://kewl_bucket" assert settings.s3_url == expected_value assert settings.s3_url1 == expected_value assert settings.s3_url2 == expected_value assert settings.s3_url3 == expected_value assert settings["s3_url"] == expected_value assert settings["S3_URL"] == expected_value assert settings.get("s3_url", default="s3://default") == expected_value assert settings.get("S3_URL", default="s3://default") == expected_value assert settings("s3_url", cast="@str") == expected_value assert settings("S3_URL", cast="@str") == expected_value expected = { "first_name": "Bruno", "morenested": { "last_name": "Rocha", "evenmore": { "full_name": "Bruno Rocha", "full_name2": "Bruno Rocha", "full_name3": "Bruno Rocha", }, },
from dynaconf import Dynaconf settings = Dynaconf(load_dotenv=True) assert settings.get("UPSTREAM_ROOK.BUILD_ROOK_FROM_GIT") == "TRUE" assert (settings.as_bool("UPSTREAM_ROOK.BUILD_ROOK_FROM_GIT") is True), settings.as_bool("UPSTREAM_ROOK.BUILD_ROOK_FROM_GIT") assert settings.get("UPSTREAM_ROOK__BUILD_ROOK_FROM_GIT", cast="@bool") is True
from dynaconf import Dynaconf, constants config = Dynaconf( envvar_prefix="EIA", load_dotenv=True, warn_dynaconf_global_settings=True, environments=True, default_env="eia", lowercase_read=False, default_settings_paths=constants.DEFAULT_SETTINGS_FILES, ) APIKEY = config.get("APIKEY")
from dynaconf import Dynaconf settings = Dynaconf( settings_files=["settings.toml", "settings.yaml"], environments=True ) assert settings.SOME_DICT.value == "formatted: foo", settings.SOME_DICT.value assert settings.INNER1.value == "inner1 str foo" assert settings.INNER1.VALUE_LIST[0] == "list 0 foo" assert settings.INNER1.INNER2.value == "inner2 str inner1 str foo" assert settings.TOP_LEVEL_LIST[0] == "top list foo" assert settings.TOP_LEVEL_LIST[3] == "a jinja formatted FOO" assert settings.get("TOP_LEVEL_LIST")[0] == "top list foo" assert settings.get("TOP_LEVEL_LIST")[3] == "a jinja formatted FOO" settings.set("INITIAL", "@merge [9, 8, 7]") settings.set("DATABASES.default.PARAMS", '@merge ["e", "f", "g"]')
from __future__ import annotations import os from dynaconf import Dynaconf settings = Dynaconf() # first we set something os.environ["DYNACONF_SOMETHING"] = "this exists" settings.get("FOO") # this is just to fire the loaders os.environ["DYNACONF_SOMETHING"] = "changed to other thing" # then we load it freshly assert settings.get_fresh("SOMETHING") == "changed to other thing" # then we remove it from environment del os.environ["DYNACONF_SOMETHING"] assert "DYNACONF_SOMETHING" not in os.environ # then we read it freshly again assert settings.get_fresh("SOMETHING") is None, settings.get_fresh("SOMETHING") settings.set("wm", "i3") assert settings.WM == "i3" settings.EDITOR = "vim"
settings_file="settings.toml", environments=True, validators=[ Validator( "FOO", env="production", default=lambda st, va: "FOO is computed in prod", ), Validator("BAR", env="production", default="@format {this.foo}/BAR"), Validator("ZAZ", env="production", default="@jinja {{this.get('foo')}}/ZAZ"), Validator("FOO", env="development", required=True, eq="dev foo"), ], ) assert settings2.FOO == "dev foo" assert settings2.get("FOO") == "dev foo" assert settings2["FOO"] == "dev foo" assert settings2.foo == "dev foo" assert settings2("foo") == "dev foo" assert settings2.from_env("production").FOO == "FOO is computed in prod" assert settings2.from_env("production").foo == "FOO is computed in prod" assert settings2.from_env("production")["FOO"] == "FOO is computed in prod" assert settings2.from_env("production")("FOO") == "FOO is computed in prod" assert settings2.from_env("production").get("FOO") == "FOO is computed in prod" assert settings2.from_env("production").BAR == "FOO is computed in prod/BAR" assert settings2.from_env("production").ZAZ == "FOO is computed in prod/ZAZ"
from __future__ import annotations from dynaconf import Dynaconf settings = Dynaconf(settings_files="settings.yaml", environments=True) print(settings.get("level1").get("level2").get("level3")) print(settings.get("level1").get("level2")) print(settings.get("level1")) print(settings.get("level1.level2.level3")) print(settings.get("level1.level2")) print(settings.get("level1")) print(settings.get("template")) print(settings.get("value0")) print(settings.get("level1.value1")) print(settings.get("level1.level2.value2")) print(settings.get("level1.level2.level3.value3")) assert settings.get("level1.level2.level3").to_dict() == { "value3": "Whoohoo world/level3/jinja" } assert settings.get("level1.level2").to_dict() == { "value2": "HELLO world/level2/jinja", "level3": { "value3": "Whoohoo world/level3/jinja" }, } assert settings.get("level1").to_dict() == { "template2": "Whoohoo @tpl@",
from __future__ import annotations from dynaconf import Dynaconf settings = Dynaconf(settings_files=["settings.toml"], ) assert settings.key == "value" assert settings.number == 789 assert settings.a_dict.nested.other_level == "nested value" assert settings["a_boolean"] is False assert settings.get("DONTEXIST", default=1) == 1 for item in settings: print(item) for key, value in settings.items(): # dict like iteration print(key, value)
from dynaconf import Dynaconf settings = Dynaconf( envvar_prefix="INVENTORY_SCAN", settings_files=["settings.yaml", "settings.local.yaml", ".secrets.yaml"], ) scans_metadata = {scan.url: scan for scan in settings.get("scans", [])}
from multiprocessing import cpu_count from dynaconf import Dynaconf from framework import dirs settings = Dynaconf( core_loaders=["YAML"], environments=True, fresh_vars=["DATABASE_URL"], ignore_unknown_envvars=True, load_dotenv=True, root_path=dirs.DIR_CONFIG.as_posix(), settings_files=["settings.yml", ".secrets.yml"], yaml_loader="safe_load", ) settings.PORT = settings.get("PORT") or 8000 settings.WEB_CONCURRENCY = (settings.get("WEB_CONCURRENCY") or cpu_count() * 2 + 1)