Fast API 作为一个新兴的 Python Web 框架,不少的开发者都在使用 FastAPI 来开发应用。我最近也在试着使用它。
在开发应用时,我习惯使用 TDD 的方式进行开发,特别是开发飞书机器人时,由于飞书给我提供的请求是可预测的,特别适合以 TDD 的方式来定义行为并实现。
同时,我在使用其他语言开发的时候,也会用到使用 .env
和 .env.testing
这样的配置文件来在不同的环境下加载不同的配置文件,达到在不同环境使用不同的变量来完成任务。
.env.testing
文件想要实现在 FastAPI 中读取 .env
文件,首先,你需要引入 pydantic_settings 包,来完成基本的配置文件的读取。
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
app_name: str = "Awesome API"
settings = Settings()
print(settings.app_name)
接下来你可以为这个 Settings 类新增 Config 配置,以实现读取本地的 .env
文件
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
app_name: str = "Awesome API"
class Config:
env_file = ".env"
settings = Settings()
print(settings.app_name)
通过上述代码,你的配置项目就会自动读取 .env
文件来加载环境变量,从而实现更加简单的环境变量管理。
.env.testing
文件在测试时,为了避免使用线上的数据,你可以在测试时加载不同的环境变量文件。
如果你只有一个测试环境,可以有一个非常简单的方式来实现:在配置 env file 时,传入一个元组,会自动加载多个文件。
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
app_name: str = "Awesome API"
class Config:
env_file = (".env",".env.testing")
settings = Settings()
print(settings.app_name)
需要注意,这里实现的实际上是使用 pydantic-settings 自己的加载顺序来实现。默认情况下,靠后的文件优先级会更高(覆盖了前面的内容)。这样的好处是如果你有些配置测试环生产是一样的,可以在 .env.testing
中加入不同的部分,相同的部分直接复用生产环境的配置项目即可。
但由于使用的是顺序加载多个问题,如果你发现表现和你配置的不一致时,就要看看是不是有优先级更高的环境变量文件覆盖了默认的 .env
文件。
借助 pydantic-settings 的一些配置,你可以快速实现 .env
和 .env.testing
的加载,相比与判断环境变量,这样会比较简单,且可以实现在 .env.testing
中只维护变量,和线上保持一致的部分可以直接继承。