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()实现进阶验证:
- 类型自动转换:环境变量字符串自动转换为声明类型(如
"true"→bool)
3.生产环境配置
3.1 多环境配置方案
1 2 3 4 5 6 7 8
| 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.生产建议
- 安全存储:密钥应通过Vault等专用系统管理,避免硬编码
- 类型安全:所有配置字段必须声明类型,禁用
Optional无约束类型
- 性能优化:使用
@lru_cache缓存配置实例减少重复加载
- 文档集成:通过
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
|