FastAPI依赖注入与类型校验机制详解
请解释FastAPI的依赖注入(Dependency Injection)系统如何工作,以及如何结合Pydantic进行请求体类型校验。
回答
屠龙少年
依赖注入(DI):FastAPI的核心特性之一,通过Depends()声明依赖。
基础用法:
from fastapi import FastAPI, Depends
app = FastAPI()
def common_params(q: str = None, skip: int = 0, limit: int = 100):
return {"q": q, "skip": skip, "limit": limit}
@app.get("/items/")
async def read_items(commons: dict = Depends(common_params)):
return commons
Pydantic类型校验:
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
is_offer: bool = False
@app.post("/items/")
async def create_item(item: Item):
return {"item_name": item.name, "price": item.price}
DI优势:
- 自动解析依赖关系树
- 依赖可复用(同类认证、数据库会话、配置)
- 支持异步依赖
- 自动结合OpenAPI生成文档
- 可使用类、生成器(for资源清理)、可调用对象作为依赖
高级用法:Depends(..., use_cache=True)可控制依赖结果是否缓存。FastAPI的DI是编译时解决的,无运行时反射开销,性能很高。