Python配置管理工具-Dynaconf入门使用教程

140 阅读3分钟

Dynaconf是Python的配置管理工具,支持从环境变量、redis、配置文件等多种方式导入配置,还同时适配Flask、Django等框架。对应官网为: www.dynaconf.com/ 。下面将介绍一些重点特性。

入门安装

  1. 安装
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