Dynaconf是Python的配置管理工具,支持从环境变量、redis、配置文件等多种方式导入配置,还同时适配Flask、Django等框架。对应官网为: www.dynaconf.com/ 。下面将介绍一些重点特性。
入门安装
- 安装
pip install dynaconf
2.初始化
在项目根目录执行以下命令
dynaconf init -f toml
执行后自动生成以下文件,当然也可以自动手动创建以下文件,效果是一样的。
.
├── config.py # Where you import your settings object (required)
├── .secrets.toml # Sensitive data like passwords and tokens (optional)
└── settings.toml # Application settings (optional)
3.在代码中加载并使用配置 config.py:用于Dynaconf添加个性化设置并读取加载配置,下文是默认生成的config.py。
from dynaconf import Dynaconf
settings = Dynaconf(
settings_files=['settings.toml', '.secrets.toml'],#需要加载的配置文件路径,相对路径从项目根目录开始
)
settings.toml:是放置各项配置的文件,下面是settings.toml的示例
key = "value"
a_boolean = false
number = 1234
a_float = 56.8
a_list = [1, 2, 3, 4]
[a_dict]
hello = "world"
[a_dict.nested]
other_level = "nested value"
your_program.py:在项目中使用Dycaconf的示例。
from config import settings
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
Dynaconf相关特性
1.Dynaconf支持多种不同格式的配置文件,具体格式包括“toml|yaml|json|ini|py”。
2.Dynaconf同时支持读取特定前缀的环境变量作为配置。
默认读取DYNACONF_ 或者 CUSTOM_为前缀的环境变量,当然也支持自定义前缀。
export DYNACONF_FOO=BAR # string value
# default DYNACONF_ prefix
export DYNACONF_NUMBER=123 # automatically loaded as int
export DJANGO_ALLOWED_HOSTS="['*', 'other']" # DJANGO_ extension prefix
# automatically loaded as a list
export FLASK_DEBUG=true # FLASK_ extension prefix
# automatically loaded as boolean
export CUSTOM_NAME=Bruno # CUSTOM_ prefix as specified in
# Dynaconf(envvar_prefix="custom")
export DYNACONF_NESTED__LEVEL__KEY=1 # Double underlines
# denotes nested settings
# nested = {
# "level": {"key": 1}
3.Dynaconf支持不同环境启用不同的配置。
- 先在config.py打开此功能
settings = Dynaconf(environments=True)
- 设置不同环境的配置,defalut标识为默认配置,下文以yaml举例,除了默认环境还有development和production环境。
default:
name: ''
development:
name: developer
production:
name: admin
- 通过环境变量控制启用不同环境
export ENV_FOR_DYNACONF=development
settings.name == "developer"
export ENV_FOR_DYNACONF=production
settings.name == "admin"
4.settings自定义设置项 settings设置项除了支持在代码中指定,也支持通过环境变量设置。如果同时指定,则环境变量优先级最高。 具体包括以下这些
- settings_file:需要读取的配置文件路径,以项目启动目录为根目录。
- environments=True:是否支持根据环境区分配置
- default_env="my_default":默认环境
- env="development":根据环境区分配置时,指定启用具体环境,如果指定环境中没有配置,则使用默认环境的配置,对应环境变量为ENV_FOR_DYNACONF,环境变量优先级比在代码中设置优先级更高。 下面举个例子: config.py文件如下,设置dev环境生效。
from dynaconf import Dynaconf
import os
settings = Dynaconf(
settings_file="./testofdyconf/settings.yaml",
environments=True,
default_env="my_default",
env="dev", # this is the active env, by default
)
print(f'test_value: {settings.test_value}')
print(f'other_value: {settings.other_value}')
对应settings.yaml文件如下
my_default:
test_value: defalut_test_value
other_value: defalut_other_value
dev:
other_value: dev_other_value
prod:
other_value: prod_other_value
由于此时代码中设置env为“dev“,输出如下:
test_value: defalut_test_value
other_value: dev_other_value
如果设置环境变量ENV_FOR_DYNACONF为”prod“。
export ENV_FOR_DYNACONF=prod
此时启动prod环境的配置,输出如下:
test_value: defalut_test_value
other_value: prod_other_value
- 通过.env文件设置环境变量,然后读取。 dynaconf建议读取环境变量的方式来加载配置。而.env后缀的文件就是存储项目相关的环境变量。 具体相关的配置如下: 1.load_dotenv:是否启动.env文件。对应环境变量为LOAD_DOTENV_FOR_DYNACONF 2.dotenv_path:.env后缀文件的地址。对应环境变量为DOTENV_PATH_FOR_DYNACONF