0%

FastAPI自学教程(29) - 依赖注入系统

1.基础用法

1
2
3
4
5
6
7
8
9
10
from fastapi import Depends, FastAPI

app = FastAPI()

async 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
  • 使用Depends()声明依赖项,将参数注入路径操作函数
  • 依赖项函数结构与路径操作函数相同,可接收查询参数、请求体等参数
  • 请求流程:
      graph TD
      A[客户端请求] --> B[FastAPI解析依赖项]
      B --> C[执行common_params函数]
      C --> D[返回处理后的字典]
      D --> E[注入read_items的commons参数]

2.带类型的依赖参数

1
2
3
4
5
6
7
8
9
10
from pydantic import BaseModel

class ItemParams(BaseModel):
q: str | None = None
skip: int = 0
limit: int = 100

@app.get("/typed-items/")
async def typed_items(params: ItemParams = Depends()):
return params.dict()
  • 支持Pydantic模型作为依赖项类型
  • 自动执行三项核心功能:
    1. 请求解析:将查询参数映射到模型字段
    2. 数据验证:检查参数类型和约束条件
    3. 错误处理:自动生成422错误响应

3.依赖类型扩展

3.1 类依赖

1
2
3
4
5
6
7
8
class Pagination:
def __init__(self, skip: int = 0, limit: int = 100):
self.skip = skip
self.limit = limit

@app.get("/users/")
async def get_users(pg: Pagination = Depends()):
return {"range": f"{pg.skip}-{pg.limit}"}
  • 类依赖自动实例化,支持复杂参数初始化

3.2 生成器依赖

1
2
3
4
5
6
7
8
9
10
11
12
from sqlalchemy.orm import Session

def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()

@app.get("/products/")
async def get_products(db: Session = Depends(get_db)):
return db.query(Product).all()
  • 支持yield语法管理资源生命周期(如数据库连接)

4.依赖树结构

1
2
3
4
5
6
7
8
9
def auth_header(token: str = Header(...)):
return verify_token(token)

def current_user(token: str = Depends(auth_header)):
return get_user(token)

@app.get("/me")
async def user_profile(user: User = Depends(current_user)):
return user.dict()
  • 支持多级依赖嵌套,形成依赖调用链
  • 执行顺序:auth_header → current_user → user_profile

5.实际应用场景

  1. 用户认证:验证JWT令牌并注入用户对象
  2. 数据库管理:自动获取/关闭数据库连接
  3. 请求日志:记录请求处理时间
  4. 参数预加工:格式化查询参数

注意事项

  • 使用Annotated注解可提升代码可读性(Python 3.10+)
  • 依赖项函数名需与参数名区分,避免命名冲突
  • 通过response_model可控制依赖项响应结构
  • 生产环境建议配合lifespan管理全局依赖