0%

FastAPI自学教程(72) - 配置与环境变量管理

1.基础用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from pydantic_settings import BaseSettings
from fastapi import FastAPI

class Settings(BaseSettings):
app_name: str = "Awesome API"
admin_email: str
items_per_user: int = 50

settings = Settings()
app = FastAPI()

@app.get("/info")
async def info():
return {
"app_name": settings.app_name,
"admin_email": settings.admin_email,
"items_per_user": settings.items_per_user
}
  • 通过继承BaseSettings创建配置模型,字段声明方式与Pydantic模型相同
  • 环境变量自动加载机制:不区分大小写读取系统环境变量(如ADMIN_EMAIL对应admin_email字段)
  • 默认值设置:未提供环境变量时使用类属性默认值

流程图:

graph TD
    A[启动应用] --> B[读取环境变量]
    B --> C{Pydantic验证}
    C -->|验证通过| D[生成配置实例]
    C -->|验证失败| E[抛出ValidationError]
    D --> F[应用初始化]

2.配置验证机制

1
2
3
4
5
from pydantic import Field

class EnhancedSettings(BaseSettings):
api_rate_limit: int = Field(1000, gt=0, env="API_RATE_LIMIT")
debug_mode: bool = False
  • 使用Field()实现进阶验证:
    • gt=0确保数值大于0
    • env显式指定环境变量名
  • 类型自动转换:环境变量字符串自动转换为声明类型(如"true"bool

3.生产环境配置

3.1 多环境配置方案

1
2
3
4
5
6
7
8
# config/__init__.py
import os

env = os.getenv("ENV", "dev")
if env == "prod":
from .production import settings
else:
from .development import settings
  • 通过环境变量ENV切换配置源
  • 开发/生产配置分离:
    • 开发环境:使用代码内默认值
    • 生产环境:通过K8s Secrets或Vault注入敏感信息

3.2 敏感信息管理

1
2
3
# .env.prod
ADMIN_EMAIL=admin@company.com
DB_PASSWORD=5f4dcc3b5aa765d61d8327deb882cf99
  • 使用.env文件管理本地开发配置(需安装python-dotenv
  • 生产环境建议通过12-Factor原则管理密钥

4.依赖注入模式

1
2
3
4
5
6
7
8
from fastapi import Depends

def get_settings():
return settings

@app.get("/debug")
async def debug(conf: Settings = Depends(get_settings)):
return {"debug_mode": conf.debug_mode}
  • 优点:支持测试时覆盖依赖项
    1
    2
    3
    4
    def override_settings():
    return Settings(admin_email="test@example.com")

    app.dependency_overrides[get_settings] = override_settings

5.生产建议

  1. 安全存储:密钥应通过Vault等专用系统管理,避免硬编码
  2. 类型安全:所有配置字段必须声明类型,禁用Optional无约束类型
  3. 性能优化:使用@lru_cache缓存配置实例减少重复加载
  4. 文档集成:通过model_config添加字段说明提升可维护性
    1
    2
    3
    4
    5
    class Config:
    env_prefix = "APP_"
    json_schema_extra = {
    "example": {"admin_email": "contact@example.com"}
    }

测试命令示例:

1
2
# 带环境变量启动
ADMIN_EMAIL="admin@site.com" uvicorn main:app