1 缘起
开始用FastAPI开发项目,
区分环境是部署的第一步,因此,需要区分dev/test/pre/prod等环境,
而FastAPI刚好提供了读取环境配置文件的参数,可以在启动服务时指定环境配置文件的路径,
参数为env_file,读取env_file的模块为python-dotenv,
需要手动安装:
pip install python-dotenv
有两种使用方式:
(1)run方法中配置:env_file=file_path
(2)Docker中使用:“–env_file”, “file_path”
分享如下,帮助需要使用FastAPI开发的读者轻松应对环境划分。
2 应用
2.1 添加环境文件
deploy/dev.env
- 文件内容
格式:key = value
读取到的数据都是str类型,因此,int类型的数据记得转换,
如果value为空字符串,读取到的数据为None,因此,只需校验None。
REDIS_HOST = "192.168.179.128"
REDIS_PORT = 6379
2.2 配置环境参数
使用启动参数:env_file,配置文件路径
if __name__ == "__main__":
env_file_path = "deploy/prod.env"
uvicorn.run(host="0.0.0.0", port=8000, app="main:app", reload=True, env_file=env_file_path)
2.3 如何获取配置的内容
import os
REDIS_HOST = os.getenv("REDIS_HOST")
REDIS_PORT = int(os.getenv("REDIS_PORT"))
3 原理
3.1 启动方法run
uvicorn启动方法run的参数有很多,源码如下图所示,
找到我们需要的env_file,用于配置环境文件路径。
位置:uvicorn.main.run
当env_file不为空时,读取env_file的方法为:load_dotenv
load_dotenv的方法源码如下,通过源码可知,
具体的读取逻辑实在方法:set_as_environment_variables中。
位置:dotenv.main.load_dotenv
set_as_environment_variables方法源码如下图所示,
由源码可知,从env_file获取的数据通过os.environ写入环境配置,
因此,可以通过os.getenv(key_name)获取对应的值。
位置:dotenv.main.DotEnv.set_as_environment_variables
4 小结
(1)FastAPI提供的启动参数众多,包括环境配置,通过参数env_file传入,如果是Dockerfile,则使用–env_file传参;
(2)读取env_file文件的模块为python-dotenv;
(3)获取的数据均为string类型,如有其他类型的数据,注意转换数据类型。