IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    FastAPI 在使用 pytest 加载不同的配置文件,以实现测试环境单独运行某些配置项目

    白宦成发表于 2023-11-26 13:30:00
    love 0

    引言

    Fast API 作为一个新兴的 Python Web 框架,不少的开发者都在使用 FastAPI 来开发应用。我最近也在试着使用它。

    在开发应用时,我习惯使用 TDD 的方式进行开发,特别是开发飞书机器人时,由于飞书给我提供的请求是可预测的,特别适合以 TDD 的方式来定义行为并实现。

    同时,我在使用其他语言开发的时候,也会用到使用 .env 和 .env.testing 这样的配置文件来在不同的环境下加载不同的配置文件,达到在不同环境使用不同的变量来完成任务。

    内容大纲

    1. 实现读取 .env 文件
    2. 实现在测试环境读取 .env.testing 文件

    模块详细内容

    实现读取 .env 文件

    想要实现在 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 中只维护变量,和线上保持一致的部分可以直接继承。


    附加部分

    • 参考链接:https://fastapi.tiangolo.com/zh/advanced/settings/


沪ICP备19023445号-2号
友情链接