Skip to content
On this page

FastAPI 引入 Dynaconf 配置系统

配置系统是一个系统的核心驱动,使用合理的配置系统便于管理散落在各处的配置参数,也方便在启动前通过配置,改变系统的行为。

Dynaconf 是一个高度灵活的配置管理工具,支持多环境分层,多种配置导入等优点,在项目开发中推荐使用。

安装 Dynaconf

安装依赖

pip install dynaconf

初始化 Dynaconf

项目目前的目录结构

.
├── app
│   ├── core
│   │   ├── config
│   │   │   ├── __init__.py
│   │   └── __init__.py
│   └── __init__.py
└── main.py

在终端内进入 app/core/config 目录下,执行 dynaconf init -f yaml 命令进行初始化,会在当前目录自动生成配置文件,新的目录接口如下

这里我根据个人喜好对目录做了一些调整

  1. 为了和 config 文件夹名字区分开,我会把生成后的 config.py 改为 settings.py;
  2. 自动生成的 .gitignore 中的内容复制到目录根目录下的 .gitignroe 文件中;
.
├── app
│   ├── core
│   │   ├── config
│   │   │   ├── __init__.py
│   │   │   ├── .secrets.yaml
│   │   │   ├── settings.py
│   │   │   └── settings.yaml
│   │   └── __init__.py
│   └── __init__.py
└── main.py

主要核心的目录是 config,里面包含了 3 个文件,分别如下:

  • settings.py 核心配置管理文件
  • settings.yaml 生产配置文件
  • .secrets.yaml 存放重要凭据的文件,在上传 Git 的过程会忽略掉;

进行多环境配置

settings.py 文件内容如下

python
from dynaconf import Dynaconf  
  
settings = Dynaconf(  
    # dynaconf 在搜索文件时用作起点的工作路径  
    root_path='app/core/config',  
    # 环境变量前缀,默认为 DYNACONF,如果设置为 MYPROGRAM,那么环境变量就应该以 MYPROGRAM_ 开头  
    # 例如 export MYPROGRAM_FOO=bar,则就可以通过 settings.foo 获取到 bar    envvar_prefix="DYNACONF",  
    # 用于指定配置文件的名称,可以是一个列表,列表中的文件会按顺序进行加载  
    settings_files=['settings.yaml', '.secrets.yaml'],  
    # 如果要根据不同的环境使用不同的配置,environments 必须设置为 True,并且配置文件中必须包含多套属性  
    # 例如 settings.yaml 中包含 [development] 和 [production] 两套配置  
    environments=True,  
)

settings.yaml 文件内容如下

yaml
# 默认  
default:  
  env: default  
  debug: true  
  
# 开发环境  
development:  
  env: development  
  debug: true  
  
# 测试环境  
test:  
  env: test  
  debug: true  
  
# 生产环境  
production:  
  env: production  
  debug: false

进行多环境验证

编写一个简单的路由来进行多环境是否生效的验证

main 文件内容如下

python
import os  
  
from fastapi import FastAPI  
  
from app.core.config.settings import settings  
  
app = FastAPI()  
  
@app.get('/hello')  
def hello():  
    return {  
        'env': settings.env,  
        'debug': settings.debug,  
    }  
  
if __name__ == '__main__':  
    # 设置 ENV_FOR_DYNACONF 为 development
    os.environ['ENV_FOR_DYNACONF'] = 'development'  
    # os.environ['ENV_FOR_DYNACONF'] = 'production'  
    import uvicorn  
    uvicorn.run('main:app', host='0.0.0.0', port=8000, reload=True)

__name__ == '__main__' 下通过分别修改 os.environ['ENV_FOR_DYNACONF'] = 'development'os.environ['ENV_FOR_DYNACONF'] = 'production' 进行测试。

启动项目后,浏览器打开 http://localhost:8000/hello,网页内容如下:

json
// os.environ['ENV_FOR_DYNACONF'] = 'development'  
{
  "env": "development",
  "debug": true
}
// os.environ['ENV_FOR_DYNACONF'] = 'production'  
{
  "env": "production",
  "debug": false
}

可以看到环境配置取决于环境变量 ENV_FOR_DYNACONF

Released under the MIT License.