CINXE.COM

Dynaconf - 3.2.10

<!doctype html> <html lang="en" class="no-js"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="description" content="Configuration Management for Python"> <meta name="author" content="Bruno Rocha"> <link rel="canonical" href="https://dynaconf.com/"> <link rel="next" href="configuration/"> <link rel="icon" href="img/favicon.ico"> <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.4"> <title>Dynaconf - 3.2.10</title> <link rel="stylesheet" href="assets/stylesheets/main.8608ea7d.min.css"> <link rel="stylesheet" href="assets/stylesheets/palette.06af60db.min.css"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> <link rel="stylesheet" href="assets/_mkdocstrings.css"> <link rel="stylesheet" href="stylesheets/mkdocstrings.css"> <script>__md_scope=new URL(".",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> </head> <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="white" data-md-color-accent="teal"> <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> <label class="md-overlay" for="__drawer"></label> <div data-md-component="skip"> <a href="#dynaconf-quick-start" class="md-skip"> Skip to content </a> </div> <div data-md-component="announce"> </div> <header class="md-header md-header--shadow" data-md-component="header"> <nav class="md-header__inner md-grid" aria-label="Header"> <a href="." title="Dynaconf - 3.2.10" class="md-header__button md-logo" aria-label="Dynaconf - 3.2.10" data-md-component="logo"> <img src="img/logo_square_d.svg" alt="logo"> </a> <label class="md-header__button md-icon" for="__drawer"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> </label> <div class="md-header__title" data-md-component="header-title"> <div class="md-header__ellipsis"> <div class="md-header__topic"> <span class="md-ellipsis"> Dynaconf - 3.2.10 </span> </div> <div class="md-header__topic" data-md-component="header-topic"> <span class="md-ellipsis"> Home </span> </div> </div> </div> <form class="md-header__option" data-md-component="palette"> <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="white" data-md-color-accent="teal" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0"> <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2a7 7 0 0 1 7 7c0 2.38-1.19 4.47-3 5.74V17a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1v-2.26C6.19 13.47 5 11.38 5 9a7 7 0 0 1 7-7M9 21v-1h6v1a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1m3-17a5 5 0 0 0-5 5c0 2.05 1.23 3.81 3 4.58V16h4v-2.42c1.77-.77 3-2.53 3-4.58a5 5 0 0 0-5-5"/></svg> </label> <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="teal" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1"> <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2a7 7 0 0 0-7 7c0 2.38 1.19 4.47 3 5.74V17a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1v-2.26c1.81-1.27 3-3.36 3-5.74a7 7 0 0 0-7-7M9 21a1 1 0 0 0 1 1h4a1 1 0 0 0 1-1v-1H9z"/></svg> </label> </form> <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> <label class="md-header__button md-icon" for="__search"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> </label> <div class="md-search" data-md-component="search" role="dialog"> <label class="md-search__overlay" for="__search"></label> <div class="md-search__inner" role="search"> <form class="md-search__form" name="search"> <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> <label class="md-search__icon md-icon" for="__search"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> </label> <nav class="md-search__options" aria-label="Search"> <a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg> </a> <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> </button> </nav> <div class="md-search__suggest" data-md-component="search-suggest"></div> </form> <div class="md-search__output"> <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> <div class="md-search-result" data-md-component="search-result"> <div class="md-search-result__meta"> Initializing search </div> <ol class="md-search-result__list" role="presentation"></ol> </div> </div> </div> </div> </div> <div class="md-header__source"> <a href="https://github.com/dynaconf/dynaconf" title="Go to repository" class="md-source" data-md-component="source"> <div class="md-source__icon md-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg> </div> <div class="md-source__repository"> dynaconf/dynaconf </div> </a> </div> </nav> </header> <div class="md-container" data-md-component="container"> <main class="md-main" data-md-component="main"> <div class="md-main__inner md-grid"> <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > <div class="md-sidebar__scrollwrap"> <div class="md-sidebar__inner"> <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0"> <label class="md-nav__title" for="__drawer"> <a href="." title="Dynaconf - 3.2.10" class="md-nav__button md-logo" aria-label="Dynaconf - 3.2.10" data-md-component="logo"> <img src="img/logo_square_d.svg" alt="logo"> </a> Dynaconf - 3.2.10 </label> <div class="md-nav__source"> <a href="https://github.com/dynaconf/dynaconf" title="Go to repository" class="md-source" data-md-component="source"> <div class="md-source__icon md-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg> </div> <div class="md-source__repository"> dynaconf/dynaconf </div> </a> </div> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item md-nav__item--active"> <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> <label class="md-nav__link md-nav__link--active" for="__toc"> <span class="md-ellipsis"> Home </span> <span class="md-nav__icon md-icon"></span> </label> <a href="." class="md-nav__link md-nav__link--active"> <span class="md-ellipsis"> Home </span> </a> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class="md-nav__title" for="__toc"> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> <li class="md-nav__item"> <a href="#features" class="md-nav__link"> <span class="md-ellipsis"> Features </span> </a> </li> <li class="md-nav__item"> <a href="#installation" class="md-nav__link"> <span class="md-ellipsis"> Installation </span> </a> <nav class="md-nav" aria-label="Installation"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#install-from-pypi" class="md-nav__link"> <span class="md-ellipsis"> Install from pypi </span> </a> </li> <li class="md-nav__item"> <a href="#initialize-dynaconf-on-your-project" class="md-nav__link"> <span class="md-ellipsis"> Initialize Dynaconf on your project </span> </a> <nav class="md-nav" aria-label="Initialize Dynaconf on your project"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#using-python-only" class="md-nav__link"> <span class="md-ellipsis"> Using Python only </span> </a> </li> <li class="md-nav__item"> <a href="#using-flask" class="md-nav__link"> <span class="md-ellipsis"> Using Flask </span> </a> </li> <li class="md-nav__item"> <a href="#using-django" class="md-nav__link"> <span class="md-ellipsis"> Using Django </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#defining-your-settings-variables" class="md-nav__link"> <span class="md-ellipsis"> Defining your settings variables </span> </a> <nav class="md-nav" aria-label="Defining your settings variables"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#on-env-vars" class="md-nav__link"> <span class="md-ellipsis"> On env vars </span> </a> </li> <li class="md-nav__item"> <a href="#on-files" class="md-nav__link"> <span class="md-ellipsis"> On files </span> </a> <nav class="md-nav" aria-label="On files"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#supported-formats" class="md-nav__link"> <span class="md-ellipsis"> Supported formats </span> </a> </li> <li class="md-nav__item"> <a href="#key-types" class="md-nav__link"> <span class="md-ellipsis"> Key types </span> </a> </li> <li class="md-nav__item"> <a href="#reading-settings-from-files" class="md-nav__link"> <span class="md-ellipsis"> Reading settings from files </span> </a> </li> <li class="md-nav__item"> <a href="#layered-environments-on-files" class="md-nav__link"> <span class="md-ellipsis"> Layered environments on files </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#reading-settings-variables" class="md-nav__link"> <span class="md-ellipsis"> Reading settings variables </span> </a> </li> <li class="md-nav__item"> <a href="#spaces-in-keys" class="md-nav__link"> <span class="md-ellipsis"> Spaces in keys </span> </a> </li> <li class="md-nav__item"> <a href="#validating-your-settings" class="md-nav__link"> <span class="md-ellipsis"> Validating your settings </span> </a> </li> <li class="md-nav__item"> <a href="#dependencies" class="md-nav__link"> <span class="md-ellipsis"> Dependencies </span> </a> <nav class="md-nav" aria-label="Dependencies"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#vendored" class="md-nav__link"> <span class="md-ellipsis"> Vendored </span> </a> </li> <li class="md-nav__item"> <a href="#optional-dependencies" class="md-nav__link"> <span class="md-ellipsis"> Optional dependencies </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#license" class="md-nav__link"> <span class="md-ellipsis"> License </span> </a> </li> <li class="md-nav__item"> <a href="#more" class="md-nav__link"> <span class="md-ellipsis"> More </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="configuration/" class="md-nav__link"> <span class="md-ellipsis"> Configuration </span> </a> </li> <li class="md-nav__item"> <a href="envvars/" class="md-nav__link"> <span class="md-ellipsis"> Env vars </span> </a> </li> <li class="md-nav__item"> <a href="settings_files/" class="md-nav__link"> <span class="md-ellipsis"> Settings files </span> </a> </li> <li class="md-nav__item"> <a href="secrets/" class="md-nav__link"> <span class="md-ellipsis"> Secrets </span> </a> </li> <li class="md-nav__item"> <a href="merging/" class="md-nav__link"> <span class="md-ellipsis"> Merging </span> </a> </li> <li class="md-nav__item"> <a href="dynamic/" class="md-nav__link"> <span class="md-ellipsis"> Dynamic Variables </span> </a> </li> <li class="md-nav__item"> <a href="cli/" class="md-nav__link"> <span class="md-ellipsis"> CLI </span> </a> </li> <li class="md-nav__item"> <a href="validation/" class="md-nav__link"> <span class="md-ellipsis"> Validation </span> </a> </li> <li class="md-nav__item"> <a href="flask/" class="md-nav__link"> <span class="md-ellipsis"> Flask </span> </a> </li> <li class="md-nav__item"> <a href="django/" class="md-nav__link"> <span class="md-ellipsis"> Django </span> </a> </li> <li class="md-nav__item"> <a href="advanced/" class="md-nav__link"> <span class="md-ellipsis"> Advanced usage </span> </a> </li> <li class="md-nav__item"> <a href="faq/" class="md-nav__link"> <span class="md-ellipsis"> FAQ </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_14" > <label class="md-nav__link" for="__nav_14" id="__nav_14_label" tabindex="0"> <span class="md-ellipsis"> Reference </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_14_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_14"> <span class="md-nav__icon md-icon"></span> Reference </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="api/" class="md-nav__link"> <span class="md-ellipsis"> dynaconf </span> </a> </li> <li class="md-nav__item"> <a href="strategies/" class="md-nav__link"> <span class="md-ellipsis"> dynaconf.strategies </span> </a> </li> </ul> </nav> </li> </ul> </nav> </div> </div> </div> <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > <div class="md-sidebar__scrollwrap"> <div class="md-sidebar__inner"> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class="md-nav__title" for="__toc"> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> <li class="md-nav__item"> <a href="#features" class="md-nav__link"> <span class="md-ellipsis"> Features </span> </a> </li> <li class="md-nav__item"> <a href="#installation" class="md-nav__link"> <span class="md-ellipsis"> Installation </span> </a> <nav class="md-nav" aria-label="Installation"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#install-from-pypi" class="md-nav__link"> <span class="md-ellipsis"> Install from pypi </span> </a> </li> <li class="md-nav__item"> <a href="#initialize-dynaconf-on-your-project" class="md-nav__link"> <span class="md-ellipsis"> Initialize Dynaconf on your project </span> </a> <nav class="md-nav" aria-label="Initialize Dynaconf on your project"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#using-python-only" class="md-nav__link"> <span class="md-ellipsis"> Using Python only </span> </a> </li> <li class="md-nav__item"> <a href="#using-flask" class="md-nav__link"> <span class="md-ellipsis"> Using Flask </span> </a> </li> <li class="md-nav__item"> <a href="#using-django" class="md-nav__link"> <span class="md-ellipsis"> Using Django </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#defining-your-settings-variables" class="md-nav__link"> <span class="md-ellipsis"> Defining your settings variables </span> </a> <nav class="md-nav" aria-label="Defining your settings variables"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#on-env-vars" class="md-nav__link"> <span class="md-ellipsis"> On env vars </span> </a> </li> <li class="md-nav__item"> <a href="#on-files" class="md-nav__link"> <span class="md-ellipsis"> On files </span> </a> <nav class="md-nav" aria-label="On files"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#supported-formats" class="md-nav__link"> <span class="md-ellipsis"> Supported formats </span> </a> </li> <li class="md-nav__item"> <a href="#key-types" class="md-nav__link"> <span class="md-ellipsis"> Key types </span> </a> </li> <li class="md-nav__item"> <a href="#reading-settings-from-files" class="md-nav__link"> <span class="md-ellipsis"> Reading settings from files </span> </a> </li> <li class="md-nav__item"> <a href="#layered-environments-on-files" class="md-nav__link"> <span class="md-ellipsis"> Layered environments on files </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#reading-settings-variables" class="md-nav__link"> <span class="md-ellipsis"> Reading settings variables </span> </a> </li> <li class="md-nav__item"> <a href="#spaces-in-keys" class="md-nav__link"> <span class="md-ellipsis"> Spaces in keys </span> </a> </li> <li class="md-nav__item"> <a href="#validating-your-settings" class="md-nav__link"> <span class="md-ellipsis"> Validating your settings </span> </a> </li> <li class="md-nav__item"> <a href="#dependencies" class="md-nav__link"> <span class="md-ellipsis"> Dependencies </span> </a> <nav class="md-nav" aria-label="Dependencies"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#vendored" class="md-nav__link"> <span class="md-ellipsis"> Vendored </span> </a> </li> <li class="md-nav__item"> <a href="#optional-dependencies" class="md-nav__link"> <span class="md-ellipsis"> Optional dependencies </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#license" class="md-nav__link"> <span class="md-ellipsis"> License </span> </a> </li> <li class="md-nav__item"> <a href="#more" class="md-nav__link"> <span class="md-ellipsis"> More </span> </a> </li> </ul> </nav> </div> </div> </div> <div class="md-content" data-md-component="content"> <article class="md-content__inner md-typeset"> <h1 id="dynaconf-quick-start">Dynaconf Quick Start<a class="headerlink" href="#dynaconf-quick-start" title="Permanent link">&para;</a></h1> <p align="center"> <a href="https://dynaconf.com"><img src="img/logo_400.svg?sanitize=true" alt="Dynaconf"></a> </p> <p align="center"> <em>Configuration Management for Python.</em> </p> <p align="center"><a href="/LICENSE"><img alt="MIT License" src="https://img.shields.io/badge/license-MIT-007EC7.svg?style=flat-square"></a> <a href="https://pypi.python.org/pypi/dynaconf"><img alt="PyPI" src="https://img.shields.io/pypi/v/dynaconf.svg"></a><a href="https://github.com/dynaconf/dynaconf/actions/workflows/main.yml"><img src="https://github.com/dynaconf/dynaconf/actions/workflows/main.yml/badge.svg"></a><a href="https://codecov.io/gh/dynaconf/dynaconf"><img alt="codecov" src="https://codecov.io/gh/dynaconf/dynaconf/branch/master/graph/badge.svg"></a> <a href="https://www.codacy.com/gh/dynaconf/dynaconf/dashboard?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=dynaconf/dynaconf&amp;utm_campaign=Badge_Grade"><img src="https://app.codacy.com/project/badge/Grade/3fb2de98464442f99a7663181803b400"/></a> <img alt="GitHub Release Date" src="https://img.shields.io/github/release-date/dynaconf/dynaconf.svg"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/dynaconf/dynaconf.svg"> <a href="https://github.com/dynaconf/dynaconf/discussions"><img alt="Discussions" src="https://img.shields.io/badge/discussions-forum-yellow.svg?logo=googlechat"></a></p> <h2 id="features">Features<a class="headerlink" href="#features" title="Permanent link">&para;</a></h2> <ul> <li>Inspired by the <strong><a href="https://12factor.net/config">12-factor application guide</a></strong></li> <li><strong>Settings management</strong> (default values, validation, parsing, templating)</li> <li>Protection of <strong>sensitive information</strong> (passwords/tokens)</li> <li>Multiple <strong>file formats</strong> <code>toml|yaml|json|ini|py</code> and also customizable loaders.</li> <li>Full support for <strong>environment variables</strong> to override existing settings (dotenv support included).</li> <li>Optional layered system for <strong>multi environments</strong> <code>[default, development, testing, production]</code> (also called multi profiles)</li> <li>Built-in support for <strong>Hashicorp Vault</strong> and <strong>Redis</strong> as settings and secrets storage.</li> <li>Built-in extensions for <strong>Django</strong> and <strong>Flask</strong> web frameworks.</li> <li><strong>CLI</strong> for common operations such as <code>init, list, write, validate, export</code>.</li> </ul> <h2 id="installation">Installation<a class="headerlink" href="#installation" title="Permanent link">&para;</a></h2> <h3 id="install-from-pypi">Install from <a href="https://pypi.org/project/dynaconf">pypi</a><a class="headerlink" href="#install-from-pypi" title="Permanent link">&para;</a></h3> <div class="highlight"><pre><span></span><code>pip<span class="w"> </span>install<span class="w"> </span>dynaconf </code></pre></div> <h3 id="initialize-dynaconf-on-your-project">Initialize Dynaconf on your project<a class="headerlink" href="#initialize-dynaconf-on-your-project" title="Permanent link">&para;</a></h3> <details open="open"> <summary>Using Python Only</summary> <h4 id="using-python-only">Using Python only<a class="headerlink" href="#using-python-only" title="Permanent link">&para;</a></h4> <p>In your project's root directory run <code>dynaconf init</code> command.</p> <p><div class="highlight"><pre><span></span><code><span class="nb">cd</span><span class="w"> </span>path/to/your/project/ <span class="hll">dynaconf<span class="w"> </span>init<span class="w"> </span>-f<span class="w"> </span>toml </span></code></pre></div> The command output must be:</p> <div class="highlight"><pre><span></span><code>⚙️ Configuring your Dynaconf environment ------------------------------------------ 🐍 The file `config.py` was generated. 🎛️ settings.toml created to hold your settings. 🔑 .secrets.toml created to hold your secrets. 🙈 the .secrets.* is also included in `.gitignore` beware to not push your secrets to a public repo. 🎉 Dynaconf is configured! read more on https://dynaconf.com </code></pre></div> <blockquote> <p>ℹ️ You can choose <code>toml|yaml|json|ini|py</code> on <code>dynaconf init -f &lt;fileformat&gt;</code>, <strong>toml</strong> is the default and also the most <strong>recommended</strong> format for configuration.</p> </blockquote> <p>Dynaconf <code>init</code> command creates the following files</p> <div class="highlight"><pre><span></span><code>. ├── config.py # Where you import your settings object (required) ├── .secrets.toml # Sensitive data like passwords and tokens (optional) └── settings.toml # Application settings (optional) </code></pre></div> <div class="tabbed-set tabbed-alternate" data-tabs="1:5"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><input id="__tabbed_1_3" name="__tabbed_1" type="radio" /><input id="__tabbed_1_4" name="__tabbed_1" type="radio" /><input id="__tabbed_1_5" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">your_program.py</label><label for="__tabbed_1_2">config.py</label><label for="__tabbed_1_3">settings.toml</label><label for="__tabbed_1_4">.secrets.toml</label><label for="__tabbed_1_5">env vars</label></div> <div class="tabbed-content"> <div class="tabbed-block"> <p>On your own code you import and use <strong>settings</strong> object imported from your <strong>config.py</strong> file <div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">config</span><span class="w"> </span><span class="kn">import</span> <span class="n">settings</span> <span class="k">assert</span> <span class="n">settings</span><span class="o">.</span><span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;value&quot;</span> <span class="k">assert</span> <span class="n">settings</span><span class="o">.</span><span class="n">number</span> <span class="o">==</span> <span class="mi">789</span> <span class="k">assert</span> <span class="n">settings</span><span class="o">.</span><span class="n">a_dict</span><span class="o">.</span><span class="n">nested</span><span class="o">.</span><span class="n">other_level</span> <span class="o">==</span> <span class="s2">&quot;nested value&quot;</span> <span class="k">assert</span> <span class="n">settings</span><span class="p">[</span><span class="s1">&#39;a_boolean&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">False</span> <span class="k">assert</span> <span class="n">settings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;DONTEXIST&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> </code></pre></div></p> </div> <div class="tabbed-block"> <p>In this file a new instance of <strong>Dynaconf</strong> settings object is initialized and configured.</p> <p><div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">dynaconf</span><span class="w"> </span><span class="kn">import</span> <span class="n">Dynaconf</span> <span class="n">settings</span> <span class="o">=</span> <span class="n">Dynaconf</span><span class="p">(</span> <span class="n">settings_files</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;settings.toml&#39;</span><span class="p">,</span> <span class="s1">&#39;.secrets.toml&#39;</span><span class="p">],</span> <span class="p">)</span> </code></pre></div> More options are described on <a href="configuration/">Dynaconf Configuration</a></p> </div> <div class="tabbed-block"> <p><strong>Optionally</strong> store settings in a file (or in multiple files) <div class="highlight"><pre><span></span><code><span class="n">key</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;value&quot;</span> <span class="n">a_boolean</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">false</span> <span class="n">number</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1234</span> <span class="n">a_float</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">56.8</span> <span class="n">a_list</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">]</span> <span class="k">[a_dict]</span> <span class="n">hello</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;world&quot;</span> <span class="k">[a_dict.nested]</span> <span class="n">other_level</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;nested value&quot;</span> </code></pre></div> More details in <a href="settings_files/">Settings Files</a></p> </div> <div class="tabbed-block"> <p><strong>Optionally</strong> store sensitive data in a local-only file <code>.secrets.toml</code> <div class="highlight"><pre><span></span><code><span class="n">password</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;s3cr3t&quot;</span> <span class="n">token</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;dfgrfg5d4g56ds4gsdf5g74984we5345-&quot;</span> <span class="n">message</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;This file doesn&#39;t go to your pub repo&quot;</span> </code></pre></div></p> <blockquote> <p>⚠️ <code>dynaconf init</code> command puts the <code>.secrets.*</code> in your <code>.gitignore</code> to avoid it being exposed on public repos but it is your responsibility to keep it safe in your local environment, also the recommendation for production environments is to use the built-in support for Hashicorp Vault service for password and tokens.</p> </blockquote> <div class="highlight"><pre><span></span><code><span class="c1"># Secrets don&#39;t go to public repos</span> <span class="na">.secrets.*</span> </code></pre></div> <p>read more on <a href="secrets/">Secrets</a></p> </div> <div class="tabbed-block"> <p><strong>Optionally</strong> override using prefixed environment variables. (<code>.env</code> files are also supported)</p> <div class="highlight"><pre><span></span><code><span class="nb">export</span><span class="w"> </span><span class="nv">DYNACONF_NUMBER</span><span class="o">=</span><span class="m">789</span> <span class="nb">export</span><span class="w"> </span><span class="nv">DYNACONF_FOO</span><span class="o">=</span><span class="nb">false</span> <span class="nb">export</span><span class="w"> </span><span class="nv">DYNACONF_DATA__CAN__BE__NESTED</span><span class="o">=</span>value <span class="nb">export</span><span class="w"> </span><span class="nv">DYNACONF_FORMATTED_KEY</span><span class="o">=</span><span class="s2">&quot;@format {this.FOO}/BAR&quot;</span> <span class="nb">export</span><span class="w"> </span><span class="nv">DYNACONF_TEMPLATED_KEY</span><span class="o">=</span><span class="s2">&quot;@jinja {{ env[&#39;HOME&#39;] | abspath }}&quot;</span> </code></pre></div> </div> </div> </div> <hr /> <blockquote> <p>ℹ️ You can create the files yourself instead of using the <code>dynaconf init</code> command and it gives any name you want instead of the default <code>config.py</code> (the file must be in your importable python path)</p> </blockquote> </details> <details> <summary>Or using Flask</summary> <h4 id="using-flask">Using Flask<a class="headerlink" href="#using-flask" title="Permanent link">&para;</a></h4> <div class="tabbed-set tabbed-alternate" data-tabs="2:4"><input checked="checked" id="__tabbed_2_1" name="__tabbed_2" type="radio" /><input id="__tabbed_2_2" name="__tabbed_2" type="radio" /><input id="__tabbed_2_3" name="__tabbed_2" type="radio" /><input id="__tabbed_2_4" name="__tabbed_2" type="radio" /><div class="tabbed-labels"><label for="__tabbed_2_1">app.py</label><label for="__tabbed_2_2">settings.toml</label><label for="__tabbed_2_3">.secrets.toml</label><label for="__tabbed_2_4">env vars</label></div> <div class="tabbed-content"> <div class="tabbed-block"> <p>In your Flask project import <code>FlaskDynaconf</code> extension and initialize it as a Flask extension. <div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">flask</span><span class="w"> </span><span class="kn">import</span> <span class="n">Flask</span> <span class="hll"><span class="kn">from</span><span class="w"> </span><span class="nn">dynaconf</span><span class="w"> </span><span class="kn">import</span> <span class="n">FlaskDynaconf</span> </span> <span class="n">app</span> <span class="o">=</span> <span class="n">Flask</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span> <span class="hll"><span class="n">FlaskDynaconf</span><span class="p">(</span><span class="n">app</span><span class="p">,</span> <span class="n">settings_files</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;settings.toml&quot;</span><span class="p">])</span> </span></code></pre></div></p> <p>Across your Flask application you can access all the settings variables direct from <code>app.config</code> that is now replaced by a dynaconf settings instance.</p> <div class="highlight"><pre><span></span><code><span class="nd">@app</span><span class="o">.</span><span class="n">route</span><span class="p">(</span><span class="s2">&quot;/a_view)</span> <span class="k">def</span><span class="w"> </span><span class="nf">a_view</span><span class="p">():</span> <span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">NAME</span> <span class="o">==</span> <span class="s2">&quot;BRUNO&quot;</span> <span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;DEBUG&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">True</span> <span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">SQLALCHEMY_DB_URI</span> <span class="o">==</span> <span class="s2">&quot;sqlite://data.db&quot;</span> </code></pre></div> </div> <div class="tabbed-block"> <p><strong>Optionally</strong> store settings in a file using layered environments.</p> <div class="highlight"><pre><span></span><code><span class="k">[default]</span> <span class="n">key</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;value&quot;</span> <span class="n">a_boolean</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">false</span> <span class="n">number</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1234</span> <span class="k">[development]</span> <span class="n">key</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;development value&quot;</span> <span class="n">SQLALCHEMY_DB_URI</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;sqlite://data.db&quot;</span> <span class="k">[production]</span> <span class="n">key</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;production value&quot;</span> <span class="n">SQLALCHEMY_DB_URI</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;postgresql://...&quot;</span> </code></pre></div> <blockquote> <p>ℹ️ On Flask, settings files are layered in multiple environments by default, you can disable it by passing <code>environments=False</code> to FlaskDynaconf extension.</p> </blockquote> <p>More details in <a href="settings_files/">Settings Files</a></p> </div> <div class="tabbed-block"> <p><strong>Optionally</strong> store sensitive data in a local-only file <code>.secrets.toml</code> <div class="highlight"><pre><span></span><code><span class="k">[development]</span> <span class="n">password</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;s3cr3t&quot;</span> <span class="n">token</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;dfgrfg5d4g56ds4gsdf5g74984we5345-&quot;</span> <span class="n">message</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;This file doesn&#39;t go to your pub repo&quot;</span> </code></pre></div></p> <blockquote> <p>⚠️ put <code>.secrets.*</code> in your <code>.gitignore</code> to avoid it being exposed on public repos but it is your responsibility to keep it safe in your local environment, also the recommendation for production environments is to use the built-in support for Hashicorp Vault service for password and tokens.</p> </blockquote> <div class="highlight"><pre><span></span><code><span class="c1"># Secrets don&#39;t go to public repos</span> <span class="na">.secrets.*</span> </code></pre></div> <p>read more on <a href="secrets/">Secrets</a></p> </div> <div class="tabbed-block"> <p><strong>Optionally</strong> override any setting using <code>FLASK_</code> prefixed environment variables. (<code>.env</code> files are also supported)</p> <div class="highlight"><pre><span></span><code><span class="nb">export</span><span class="w"> </span><span class="nv">FLASK_ENV</span><span class="o">=</span>production <span class="nb">export</span><span class="w"> </span><span class="nv">FLASK_NUMBER</span><span class="o">=</span><span class="m">789</span> <span class="nb">export</span><span class="w"> </span><span class="nv">FLASK_FOO</span><span class="o">=</span><span class="nb">false</span> </code></pre></div> </div> </div> </div> <hr /> <p>Dynaconf can also <strong>load your Flask extensions</strong> for you see more details in <a href="flask/">Flask Extension</a></p> </details> <details> <summary>Or using Django</summary> <h4 id="using-django">Using Django<a class="headerlink" href="#using-django" title="Permanent link">&para;</a></h4> <p>Ensure you have <code>DJANGO_SETTINGS_MODULE</code> exported:</p> <div class="highlight"><pre><span></span><code><span class="nb">export</span><span class="w"> </span><span class="nv">DJANGO_SETTINGS_MODULE</span><span class="o">=</span>yourproject.settings </code></pre></div> <p>On the same folder where your <code>manage.py</code> is located run <code>dynaconf init</code> command.</p> <div class="highlight"><pre><span></span><code><span class="hll">dynaconf<span class="w"> </span>init<span class="w"> </span>-f<span class="w"> </span>yaml </span></code></pre></div> <p>Then follow the instructions on the terminal.</p> <div class="highlight"><pre><span></span><code>Django app detected ⚙️ Configuring your Dynaconf environment ------------------------------------------ 🎛️ settings.yaml created to hold your settings. 🔑 .secrets.yaml created to hold your secrets. 🙈 the .secrets.yaml is also included in `.gitignore` beware of not pushing your secrets to a public repo or use dynaconf builtin support for Vault Servers. ⁉ path/to/yourproject/settings.py is found do you want to add dynaconf? [y/N]: </code></pre></div> <p>Answer <strong>y</strong></p> <div class="highlight"><pre><span></span><code>🎠 Now your Django settings are managed by Dynaconf 🎉 Dynaconf is configured! read more at https://dynaconf.com </code></pre></div> <blockquote> <p>ℹ️ On Django the recommended file format is <strong>yaml</strong> because it can hold complex data structures easier, however, you can choose to use toml, json, ini or even keep your settings in .py format.</p> </blockquote> <div class="tabbed-set tabbed-alternate" data-tabs="3:5"><input checked="checked" id="__tabbed_3_1" name="__tabbed_3" type="radio" /><input id="__tabbed_3_2" name="__tabbed_3" type="radio" /><input id="__tabbed_3_3" name="__tabbed_3" type="radio" /><input id="__tabbed_3_4" name="__tabbed_3" type="radio" /><input id="__tabbed_3_5" name="__tabbed_3" type="radio" /><div class="tabbed-labels"><label for="__tabbed_3_1">appname/views.py</label><label for="__tabbed_3_2">settings.yaml</label><label for="__tabbed_3_3">.secrets.yaml</label><label for="__tabbed_3_4">env vars</label><label for="__tabbed_3_5">projectname/settings.py</label></div> <div class="tabbed-content"> <div class="tabbed-block"> <p>On your Django views, models and all other places you can now use <strong>django.conf.settings</strong> normally because it is replaced by a Dynaconf settings object.</p> <div class="highlight"><pre><span></span><code><span class="hll"><span class="kn">from</span><span class="w"> </span><span class="nn">django.conf</span><span class="w"> </span><span class="kn">import</span> <span class="n">settings</span> </span> <span class="k">def</span><span class="w"> </span><span class="nf">index</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> <span class="hll"> <span class="k">assert</span> <span class="n">settings</span><span class="o">.</span><span class="n">DEBUG</span> <span class="ow">is</span> <span class="kc">True</span> </span><span class="hll"> <span class="k">assert</span> <span class="n">settings</span><span class="o">.</span><span class="n">NAME</span> <span class="o">==</span> <span class="s2">&quot;Bruno&quot;</span> </span><span class="hll"> <span class="k">assert</span> <span class="n">settings</span><span class="o">.</span><span class="n">DATABASES</span><span class="o">.</span><span class="n">default</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;db&quot;</span> </span><span class="hll"> <span class="k">assert</span> <span class="n">settings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;NONEXISTENT&quot;</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span> </span></code></pre></div> </div> <div class="tabbed-block"> <p><strong>Optionally</strong> store settings in a file using layered environments. this file must be located in the folder where your <code>manage.py</code> is located.</p> <div class="highlight"><pre><span></span><code><span class="nt">default</span><span class="p">:</span> <span class="w"> </span><span class="nt">ALLOWED_HOSTS</span><span class="p">:</span> <span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&#39;*&#39;</span> <span class="w"> </span><span class="nt">INSTALLED_APPS</span><span class="p">:</span> <span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">django.contrib.admin</span> <span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">django.contrib.auth</span> <span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">django.contrib.contenttypes</span> <span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">django.contrib.sessions</span> <span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">django.contrib.messages</span> <span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">django.contrib.staticfiles</span> <span class="nt">production</span><span class="p">:</span> <span class="w"> </span><span class="nt">ALLOWED_HOSTS</span><span class="p">:</span> <span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&#39;server.prod.com&#39;</span> </code></pre></div> <blockquote> <p>ℹ️ On Django settings files are layered in multiple environments by default, you can disable it by passing <code>environments=False</code> to FlaskDynaconf extension.</p> </blockquote> <p>More details in <a href="settings_files/">Settings Files</a></p> </div> <div class="tabbed-block"> <p><strong>Optionally</strong> store sensitive data in a local-only file <code>.secrets.toml</code> <div class="highlight"><pre><span></span><code><span class="nt">development</span><span class="p">:</span> <span class="w"> </span><span class="nt">SECRET_KEY</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">43grng9398534nfkjer</span> <span class="nt">production</span><span class="p">:</span> <span class="w"> </span><span class="nt">SECRET_KEY</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">vfkjndkjg098gdf90gudfsg</span> </code></pre></div></p> <blockquote> <p>⚠️ put <code>.secrets.*</code> in your <code>.gitignore</code> to avoid it being exposed on public repos but it is your responsibility to keep it safe in your local environment, also the recommendation for production environments is to use the built-in support for Hashicorp Vault service for password and tokens.</p> </blockquote> <div class="highlight"><pre><span></span><code><span class="c1"># Secrets don&#39;t go to public repos</span> <span class="na">.secrets.*</span> </code></pre></div> <p>read more on <a href="secrets/">Secrets</a></p> </div> <div class="tabbed-block"> <p><strong>Optionally</strong> override any setting using <code>DJANGO_</code> prefixed environment variables. (<code>.env</code> files are also supported)</p> <div class="highlight"><pre><span></span><code><span class="nb">export</span><span class="w"> </span><span class="nv">DJANGO_ENV</span><span class="o">=</span>production <span class="nb">export</span><span class="w"> </span><span class="nv">DJANGO_NUMBER</span><span class="o">=</span><span class="m">789</span> <span class="nb">export</span><span class="w"> </span><span class="nv">DJANGO_FOO</span><span class="o">=</span><span class="nb">false</span> <span class="nb">export</span><span class="w"> </span><span class="nv">DJANGO_ALLOWED_HOSTS</span><span class="o">=</span><span class="s2">&quot;[&#39;*&#39;]&quot;</span> <span class="nb">export</span><span class="w"> </span><span class="nv">DJANGO_DEBUG</span><span class="o">=</span><span class="nb">false</span> <span class="nb">export</span><span class="w"> </span><span class="nv">DJANGO_DATABASES__default__NAME</span><span class="o">=</span>othername </code></pre></div> </div> <div class="tabbed-block"> <p>Once initialized dynaconf includes the following on the bottom of your existing <code>settings.py</code> and you need to keep these lines there.</p> <div class="highlight"><pre><span></span><code><span class="c1"># HERE STARTS DYNACONF EXTENSION LOAD</span> <span class="kn">import</span><span class="w"> </span><span class="nn">dynaconf</span> <span class="c1"># noqa</span> <span class="n">settings</span> <span class="o">=</span> <span class="n">dynaconf</span><span class="o">.</span><span class="n">DjangoDynaconf</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span> <span class="c1"># noqa</span> <span class="c1"># HERE ENDS DYNACONF EXTENSION LOAD (No more code below this line)</span> </code></pre></div> </div> </div> </div> <hr /> <p>More details in <a href="django/">Django Extension</a></p> </details> <hr /> <div class="admonition tip"> <p class="admonition-title">Tip</p> <p>The <code>dynaconf</code> CLI has more useful commands such as <code>list | export</code>, <code>init</code>, <code>write</code> and <code>validate</code> read more on <a href="cli/">CLI</a></p> </div> <h2 id="defining-your-settings-variables">Defining your settings variables<a class="headerlink" href="#defining-your-settings-variables" title="Permanent link">&para;</a></h2> <p>Dynaconf prioritizes the use of <a href="envvars/">environment variables</a> and you can optionally store settings in <a href="settings_files/">Settings Files</a> using any of <code>toml|yaml|json|ini|py</code> extension.</p> <h3 id="on-env-vars">On env vars<a class="headerlink" href="#on-env-vars" title="Permanent link">&para;</a></h3> <p><a href="envvars/">environment variables</a> are loaded by Dynaconf if prefixed either with <code>DYNACONF_</code> or a <code>CUSTOM_</code> name that you can customize on your settings instance, or <code>FLASK_</code> and <code>DJANGO_</code> respectively if you are using extensions.</p> <div class="highlight"><pre><span></span><code><span class="nb">export</span><span class="w"> </span><span class="nv">DYNACONF_FOO</span><span class="o">=</span>BAR<span class="w"> </span><span class="c1"># string value</span> <span class="w"> </span><span class="c1"># default DYNACONF_ prefix</span> <span class="nb">export</span><span class="w"> </span><span class="nv">DYNACONF_NUMBER</span><span class="o">=</span><span class="m">123</span><span class="w"> </span><span class="c1"># automatically loaded as int</span> <span class="nb">export</span><span class="w"> </span><span class="nv">DJANGO_ALLOWED_HOSTS</span><span class="o">=</span><span class="s2">&quot;[&#39;*&#39;, &#39;other&#39;]&quot;</span><span class="w"> </span><span class="c1"># DJANGO_ extension prefix</span> <span class="w"> </span><span class="c1"># automatically loaded as a list</span> <span class="nb">export</span><span class="w"> </span><span class="nv">FLASK_DEBUG</span><span class="o">=</span><span class="nb">true</span><span class="w"> </span><span class="c1"># FLASK_ extension prefix</span> <span class="w"> </span><span class="c1"># automatically loaded as boolean</span> <span class="nb">export</span><span class="w"> </span><span class="nv">CUSTOM_NAME</span><span class="o">=</span>Bruno<span class="w"> </span><span class="c1"># CUSTOM_ prefix as specified in</span> <span class="w"> </span><span class="c1"># Dynaconf(envvar_prefix=&quot;custom&quot;)</span> <span class="nb">export</span><span class="w"> </span><span class="nv">DYNACONF_NESTED__LEVEL__KEY</span><span class="o">=</span><span class="m">1</span><span class="w"> </span><span class="c1"># Double underlines</span> <span class="w"> </span><span class="c1"># denotes nested settings</span> <span class="w"> </span><span class="c1"># nested = {</span> <span class="w"> </span><span class="c1"># &quot;level&quot;: {&quot;key&quot;: 1}</span> <span class="w"> </span><span class="c1"># }</span> </code></pre></div> <p>More details on <a href="envvars/">environment variables</a>.</p> <h3 id="on-files">On files<a class="headerlink" href="#on-files" title="Permanent link">&para;</a></h3> <p><strong>Optionally</strong> you can store settings in files, dynaconf supports multiple file formats, you are recommended to choose one format but you can also use mixed settings formats across your application.</p> <h4 id="supported-formats">Supported formats<a class="headerlink" href="#supported-formats" title="Permanent link">&para;</a></h4> <p>Create your settings in the desired format and specify it on <code>settings_files</code> argument on your dynaconf instance or pass it in <code>-f &lt;format&gt;</code> if using <code>dynaconf init</code> command.</p> <p>The following are the currently supported formats:</p> <ul> <li><strong>.toml</strong> - Default and <strong>recommended</strong> file format.</li> <li><strong>.yaml|.yml</strong> - Recommended for Django applications.</li> <li><strong>.json</strong> - Useful to reuse existing or exported settings.</li> <li><strong>.ini</strong> - Useful to reuse legacy settings.</li> <li><strong>.py</strong> - <strong>Not Recommended</strong> but supported for backwards compatibility.</li> <li><strong>.env</strong> - Useful to automate the loading of environment variables.</li> </ul> <div class="admonition tip"> <p class="admonition-title">Tip</p> <p>Can't find the file format you need for your settings? You can create your custom loader and read any data source. read more on <a href="advanced/">extending dynaconf</a></p> </div> <h4 id="key-types">Key types<a class="headerlink" href="#key-types" title="Permanent link">&para;</a></h4> <p>Dynaconf will try to preserve non-string integers such as <code>1: foo</code> in yaml, or arbitrary types defined within python, like <code>settings.set("a", {1: "b", (1,2): "c"})</code>.</p> <p>This is intended for special cases only, as envvars and most file loaders won't support non-string key types.</p> <h4 id="reading-settings-from-files">Reading settings from files<a class="headerlink" href="#reading-settings-from-files" title="Permanent link">&para;</a></h4> <p>On files by default dynaconf loads all the existing keys and sections as first-level settings.</p> <div class="tabbed-set tabbed-alternate" data-tabs="4:5"><input checked="checked" id="__tabbed_4_1" name="__tabbed_4" type="radio" /><input id="__tabbed_4_2" name="__tabbed_4" type="radio" /><input id="__tabbed_4_3" name="__tabbed_4" type="radio" /><input id="__tabbed_4_4" name="__tabbed_4" type="radio" /><input id="__tabbed_4_5" name="__tabbed_4" type="radio" /><div class="tabbed-labels"><label for="__tabbed_4_1">settings.toml</label><label for="__tabbed_4_2">settings.yaml</label><label for="__tabbed_4_3">settings.json</label><label for="__tabbed_4_4">settings.ini</label><label for="__tabbed_4_5">settings.py</label></div> <div class="tabbed-content"> <div class="tabbed-block"> <div class="highlight"><pre><span></span><code><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;Bruno&quot;</span> </code></pre></div> </div> <div class="tabbed-block"> <div class="highlight"><pre><span></span><code><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Bruno</span> </code></pre></div> </div> <div class="tabbed-block"> <div class="highlight"><pre><span></span><code><span class="p">{</span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Bruno&quot;</span><span class="p">}</span> </code></pre></div> </div> <div class="tabbed-block"> <div class="highlight"><pre><span></span><code><span class="na">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#39;Bruno&#39;</span> </code></pre></div> </div> <div class="tabbed-block"> <div class="highlight"><pre><span></span><code><span class="n">NAME</span> <span class="o">=</span> <span class="s2">&quot;Bruno&quot;</span> </code></pre></div> <blockquote> <p>⚠️ on <code>.py</code> files dynaconf only read UPPERCASE variables.</p> </blockquote> </div> </div> </div> <p>Then on your application code:</p> <div class="highlight"><pre><span></span><code><span class="n">settings</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;Bruno&quot;</span> </code></pre></div> <h4 id="layered-environments-on-files">Layered environments on files<a class="headerlink" href="#layered-environments-on-files" title="Permanent link">&para;</a></h4> <p>It is also possible to make dynaconf read the files separated by layered environments so each section or first-level key is loaded as a distinct environment.</p> <div class="admonition warning"> <p class="admonition-title">Warning</p> <p>To enable layered environments the argument <code>environments</code> must be set to <code>True</code>, otherwise, dynaconf will ignore layers and read all first-level keys as normal values.</p> </div> <div class="tabbed-set tabbed-alternate" data-tabs="5:5"><input checked="checked" id="__tabbed_5_1" name="__tabbed_5" type="radio" /><input id="__tabbed_5_2" name="__tabbed_5" type="radio" /><input id="__tabbed_5_3" name="__tabbed_5" type="radio" /><input id="__tabbed_5_4" name="__tabbed_5" type="radio" /><input id="__tabbed_5_5" name="__tabbed_5" type="radio" /><div class="tabbed-labels"><label for="__tabbed_5_1">config.py</label><label for="__tabbed_5_2">settings.toml</label><label for="__tabbed_5_3">settings.yaml</label><label for="__tabbed_5_4">settings.json</label><label for="__tabbed_5_5">settings.ini</label></div> <div class="tabbed-content"> <div class="tabbed-block"> <div class="highlight"><pre><span></span><code><span class="n">settings</span> <span class="o">=</span> <span class="n">Dynaconf</span><span class="p">(</span><span class="n">environments</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> </code></pre></div> </div> <div class="tabbed-block"> <div class="highlight"><pre><span></span><code><span class="k">[default]</span> <span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;&quot;</span> <span class="k">[development]</span> <span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;developer&quot;</span> <span class="k">[production]</span> <span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;admin&quot;</span> </code></pre></div> </div> <div class="tabbed-block"> <div class="highlight"><pre><span></span><code><span class="nt">default</span><span class="p">:</span> <span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;&#39;</span> <span class="nt">development</span><span class="p">:</span> <span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">developer</span> <span class="nt">production</span><span class="p">:</span> <span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">admin</span> </code></pre></div> </div> <div class="tabbed-block"> <div class="highlight"><pre><span></span><code><span class="p">{</span> <span class="w"> </span><span class="nt">&quot;default&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;&quot;</span> <span class="w"> </span><span class="p">},</span> <span class="w"> </span><span class="nt">&quot;development&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;developer&quot;</span> <span class="w"> </span><span class="p">},</span> <span class="w"> </span><span class="nt">&quot;production&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;admin&quot;</span> <span class="w"> </span><span class="p">}</span> <span class="p">}</span> </code></pre></div> </div> <div class="tabbed-block"> <div class="highlight"><pre><span></span><code><span class="k">[default]</span> <span class="na">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;&quot;</span> <span class="k">[development]</span> <span class="na">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;developer&quot;</span> <span class="k">[production]</span> <span class="na">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;admin&quot;</span> </code></pre></div> </div> </div> </div> <blockquote> <p>ℹ️ You can define a custom environment using the name you want <code>[default]</code> and <code>[global]</code> are the only environments that are special. You can for example name it <code>[testing]</code> or <code>[anything]</code></p> </blockquote> <div class="tabbed-set tabbed-alternate" data-tabs="6:1"><input checked="checked" id="__tabbed_6_1" name="__tabbed_6" type="radio" /><div class="tabbed-labels"><label for="__tabbed_6_1">program.py</label></div> <div class="tabbed-content"> <div class="tabbed-block"> <p>Then in your program you can use environment variables to switch environments.</p> <p><code class="highlight"><span class="nb">export</span><span class="w"> </span><span class="nv">ENV_FOR_DYNACONF</span><span class="o">=</span>development</code></p> <div class="highlight"><pre><span></span><code><span class="n">settings</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;developer&quot;</span> </code></pre></div> <p><code class="highlight"><span class="nb">export</span><span class="w"> </span><span class="nv">ENV_FOR_DYNACONF</span><span class="o">=</span>production</code></p> <div class="highlight"><pre><span></span><code><span class="n">settings</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;admin&quot;</span> </code></pre></div> </div> </div> </div> <div class="admonition warning"> <p class="admonition-title">Warning</p> <p>On <strong>Flask</strong> and <strong>Django</strong> extensions the default behaviour is already the layered environments. Also to switch the environment you use <code class="highlight"><span class="nb">export</span><span class="w"> </span><span class="nv">FLASK_ENV</span><span class="o">=</span>production</code> or <code class="highlight"><span class="nb">export</span><span class="w"> </span><span class="nv">DJANGO_ENV</span><span class="o">=</span>production</code> respectively.</p> </div> <div class="admonition tip"> <p class="admonition-title">Tip</p> <p>It is also possible to switch environments programmatically passing <code>env="development"</code> to <code>Dynaconf</code> class on instantiation.</p> </div> <p>Read more on <a href="settings_files/">Settings Files</a></p> <h2 id="reading-settings-variables">Reading settings variables<a class="headerlink" href="#reading-settings-variables" title="Permanent link">&para;</a></h2> <p>An instance of <code>Dynaconf settings</code> is a <strong>dict</strong> like object that provides multiple ways to access variables.</p> <div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">path.to.project.config</span><span class="w"> </span><span class="kn">import</span> <span class="n">settings</span> <span class="c1"># or</span> <span class="kn">from</span><span class="w"> </span><span class="nn">django.conf</span><span class="w"> </span><span class="kn">import</span> <span class="n">settings</span> <span class="c1"># or</span> <span class="n">settings</span> <span class="o">=</span> <span class="n">app</span><span class="o">.</span><span class="n">config</span> <span class="c1"># flask</span> <span class="c1"># reading settings variables</span> <span class="n">settings</span><span class="o">.</span><span class="n">username</span> <span class="o">==</span> <span class="s2">&quot;admin&quot;</span> <span class="c1"># dot notation</span> <span class="n">settings</span><span class="o">.</span><span class="n">PORT</span> <span class="o">==</span> <span class="n">settings</span><span class="o">.</span><span class="n">port</span> <span class="o">==</span> <span class="mi">9900</span> <span class="c1"># case insensitive</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">port</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span> <span class="c1"># automatic type casting</span> <span class="n">settings</span><span class="o">.</span><span class="n">databases</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;mydb&quot;</span> <span class="c1"># Nested keys traversing</span> <span class="n">settings</span><span class="p">[</span><span class="s1">&#39;password&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;secret123&quot;</span> <span class="c1"># dict like item access</span> <span class="n">settings</span><span class="p">[</span><span class="s1">&#39;databases.schema&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;main&quot;</span> <span class="c1"># Nested items traversing</span> <span class="n">settings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;nonexisting&quot;</span><span class="p">,</span> <span class="s2">&quot;default value&quot;</span><span class="p">)</span> <span class="c1"># Default values just like a dict</span> <span class="n">settings</span><span class="p">(</span><span class="s2">&quot;number&quot;</span><span class="p">,</span> <span class="n">cast</span><span class="o">=</span><span class="s2">&quot;@int&quot;</span><span class="p">)</span> <span class="c1"># customizable forcing of casting</span> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">settings</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> <span class="c1"># dict like iteration</span> <span class="nb">print</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> </code></pre></div> <h2 id="spaces-in-keys">Spaces in keys<a class="headerlink" href="#spaces-in-keys" title="Permanent link">&para;</a></h2> <p>If the key has spaces it can be accessed by replacing the space with an underscore.</p> <div class="highlight"><pre><span></span><code><span class="nt">ROOT</span><span class="p">:</span> <span class="w"> </span><span class="nt">MY KEY</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;value&quot;</span> </code></pre></div> <div class="highlight"><pre><span></span><code><span class="n">settings</span><span class="o">.</span><span class="n">root</span><span class="o">.</span><span class="n">my_key</span> <span class="o">==</span> <span class="s2">&quot;value&quot;</span> <span class="n">settings</span><span class="o">.</span><span class="n">root</span><span class="p">[</span><span class="s2">&quot;my key&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;value&quot;</span> </code></pre></div> <h2 id="validating-your-settings">Validating your settings<a class="headerlink" href="#validating-your-settings" title="Permanent link">&para;</a></h2> <p>Dynaconf offers the <code>Validator</code> object for you to define rules for your settings <strong>schema</strong>, this works in a declarative way and you can validate your settings in 2 ways.</p> <details> <summary>Writing Validators as Python objects</summary> <p>On your <strong>config.py</strong> <div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">dynaconf</span><span class="w"> </span><span class="kn">import</span> <span class="n">Dynaconf</span><span class="p">,</span> <span class="n">Validator</span> <span class="n">settings</span> <span class="o">=</span> <span class="n">Dynaconf</span><span class="p">(</span> <span class="n">validators</span><span class="o">=</span><span class="p">[</span> <span class="n">Validator</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="p">,</span> <span class="n">eq</span><span class="o">=</span><span class="s2">&quot;Bruno&quot;</span><span class="p">)</span> <span class="o">&amp;</span> <span class="n">Validator</span><span class="p">(</span><span class="s2">&quot;username&quot;</span><span class="p">,</span> <span class="n">ne</span><span class="o">=</span><span class="s2">&quot;admin&quot;</span><span class="p">),</span> <span class="n">Validator</span><span class="p">(</span><span class="s2">&quot;port&quot;</span><span class="p">,</span> <span class="n">gte</span><span class="o">=</span><span class="mi">5000</span><span class="p">,</span> <span class="n">lte</span><span class="o">=</span><span class="mi">8000</span><span class="p">),</span> <span class="n">Validator</span><span class="p">(</span><span class="s2">&quot;host&quot;</span><span class="p">,</span> <span class="n">must_exist</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="o">|</span> <span class="n">Validator</span><span class="p">(</span><span class="s2">&quot;bind&quot;</span><span class="p">,</span> <span class="n">must_exist</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="p">]</span> <span class="p">)</span> </code></pre></div></p> <p>Once passed in on <code>validators</code> argument, Dynaconf will evaluate each of the rules before your settings are first read.</p> <p>An alternative way is registering validators using.</p> <div class="highlight"><pre><span></span><code><span class="n">settings</span><span class="o">.</span><span class="n">validators</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">Validator</span><span class="p">(</span><span class="s2">&quot;field&quot;</span><span class="p">,</span> <span class="o">**</span><span class="n">rules</span><span class="p">))</span> </code></pre></div> <p>You can also force the earlier validation by making a call to <code>validate</code> after your settings instantiation.</p> <div class="highlight"><pre><span></span><code><span class="n">settings</span><span class="o">.</span><span class="n">validators</span><span class="o">.</span><span class="n">validate</span><span class="p">()</span> </code></pre></div> <p>In case of errors it will raise <code>ValidationError</code> and exit with status 1 (useful for CI)</p> </details> <details> <summary>Writing Validators as a toml file</summary> <p>You can also alternatively place a <code>dynaconf_validators.toml</code> file in the root of your project.</p> <div class="highlight"><pre><span></span><code><span class="k">[development]</span> <span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="n">must_exist</span><span class="p">=</span><span class="kc">true</span><span class="p">}</span> <span class="n">port</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="n">gte</span><span class="p">=</span><span class="mi">5000</span><span class="p">,</span><span class="w"> </span><span class="n">lte</span><span class="p">=</span><span class="mi">9000</span><span class="p">}</span> </code></pre></div> <p>Following the same rules used in the <code>Validator</code> class, then you can trigger the validation via the command line using.</p> <div class="highlight"><pre><span></span><code>dynaconf<span class="w"> </span>-i<span class="w"> </span>config.settings<span class="w"> </span>validate </code></pre></div> </details> <p>Read more on <a href="validation/">Validation</a></p> <h2 id="dependencies">Dependencies<a class="headerlink" href="#dependencies" title="Permanent link">&para;</a></h2> <h3 id="vendored">Vendored<a class="headerlink" href="#vendored" title="Permanent link">&para;</a></h3> <p>Dynaconf core has no dependency. It uses vendored copies of external libraries such as <strong>python-box, click, python-dotenv, ruamel-yaml, python-toml</strong></p> <h3 id="optional-dependencies">Optional dependencies<a class="headerlink" href="#optional-dependencies" title="Permanent link">&para;</a></h3> <p>To use external services such as <strong>Redis</strong> and <strong>Hashicorp Vault</strong> it is necessary to install additional dependencies using pip <code>[extra]</code> argument.</p> <p><strong>Vault</strong></p> <div class="highlight"><pre><span></span><code>pip<span class="w"> </span>install<span class="w"> </span>dynaconf<span class="o">[</span>vault<span class="o">]</span> </code></pre></div> <p><strong>Redis</strong></p> <div class="highlight"><pre><span></span><code>pip<span class="w"> </span>install<span class="w"> </span>dynaconf<span class="o">[</span>redis<span class="o">]</span> </code></pre></div> <p>Read more on <a href="advanced/#creating-new-loaders">external loaders</a></p> <h2 id="license">License<a class="headerlink" href="#license" title="Permanent link">&para;</a></h2> <p>This project is licensed under the terms of the MIT license.</p> <h2 id="more">More<a class="headerlink" href="#more" title="Permanent link">&para;</a></h2> <p>If you are looking for something similar to Dynaconf to use in your Rust projects: <a href="https://github.com/rubik/hydroconf">https://github.com/rubik/hydroconf</a></p> <aside class="md-source-file"> <span class="md-source-file__fact"> <span class="md-icon" title="Last update"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 13.1c-.1 0-.3.1-.4.2l-1 1 2.1 2.1 1-1c.2-.2.2-.6 0-.8l-1.3-1.3c-.1-.1-.2-.2-.4-.2m-1.9 1.8-6.1 6V23h2.1l6.1-6.1zM12.5 7v5.2l4 2.4-1 1L11 13V7zM11 21.9c-5.1-.5-9-4.8-9-9.9C2 6.5 6.5 2 12 2c5.3 0 9.6 4.1 10 9.3-.3-.1-.6-.2-1-.2s-.7.1-1 .2C19.6 7.2 16.2 4 12 4c-4.4 0-8 3.6-8 8 0 4.1 3.1 7.5 7.1 7.9l-.1.2z"/></svg> </span> 2024-03-06 </span> </aside> </article> </div> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> </main> <footer class="md-footer"> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class="md-copyright"> Made with <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> Material for MkDocs </a> </div> <div class="md-social"> <a href="https://github.com/dynaconf/dynaconf" target="_blank" rel="noopener" title="github.com" class="md-social__link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 480 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M186.1 328.7c0 20.9-10.9 55.1-36.7 55.1s-36.7-34.2-36.7-55.1 10.9-55.1 36.7-55.1 36.7 34.2 36.7 55.1M480 278.2c0 31.9-3.2 65.7-17.5 95-37.9 76.6-142.1 74.8-216.7 74.8-75.8 0-186.2 2.7-225.6-74.8-14.6-29-20.2-63.1-20.2-95 0-41.9 13.9-81.5 41.5-113.6-5.2-15.8-7.7-32.4-7.7-48.8 0-21.5 4.9-32.3 14.6-51.8 45.3 0 74.3 9 108.8 36 29-6.9 58.8-10 88.7-10 27 0 54.2 2.9 80.4 9.2 34-26.7 63-35.2 107.8-35.2 9.8 19.5 14.6 30.3 14.6 51.8 0 16.4-2.6 32.7-7.7 48.2 27.5 32.4 39 72.3 39 114.2m-64.3 50.5c0-43.9-26.7-82.6-73.5-82.6-18.9 0-37 3.4-56 6-14.9 2.3-29.8 3.2-45.1 3.2-15.2 0-30.1-.9-45.1-3.2-18.7-2.6-37-6-56-6-46.8 0-73.5 38.7-73.5 82.6 0 87.8 80.4 101.3 150.4 101.3h48.2c70.3 0 150.6-13.4 150.6-101.3m-82.6-55.1c-25.8 0-36.7 34.2-36.7 55.1s10.9 55.1 36.7 55.1 36.7-34.2 36.7-55.1-10.9-55.1-36.7-55.1"/></svg> </a> <a href="https://twitter.com/rochacbruno" target="_blank" rel="noopener" title="twitter.com" class="md-social__link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253"/></svg> </a> <a href="https://linkedin.com/in/rochacbruno" target="_blank" rel="noopener" title="linkedin.com" class="md-social__link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5m282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9z"/></svg> </a> <a href="https://twitch.tv/codeshow" target="_blank" rel="noopener" title="twitch.tv" class="md-social__link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M391.17 103.47h-38.63v109.7h38.63ZM285 103h-38.63v109.75H285ZM120.83 0 24.31 91.42v329.16h115.83V512l96.53-91.42h77.25L487.69 256V0Zm328.24 237.75-77.22 73.12h-77.24l-67.6 64v-64h-86.87V36.58h308.93Z"/></svg> </a> </div> </div> </div> </footer> </div> <div class="md-dialog" data-md-component="dialog"> <div class="md-dialog__inner md-typeset"></div> </div> <script id="__config" type="application/json">{"base": ".", "features": ["search.suggest", "search.highlight", "search.share", "content.code.annotate"], "search": "assets/javascripts/workers/search.f8cc74c7.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script> <script src="assets/javascripts/bundle.f1b6f286.min.js"></script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10