Appearance
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
命令进行初始化,会在当前目录自动生成配置文件,新的目录接口如下
这里我根据个人喜好对目录做了一些调整
- 为了和 config 文件夹名字区分开,我会把生成后的 config.py 改为 settings.py;
- 自动生成的 .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
。