0%

FastAPI自学教程(30) - 类作为依赖项

1. 基础类依赖

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

app = FastAPI()

class Pagination:
def __init__(self, skip: int = 0, limit: int = 100):
self.skip = skip
self.limit = limit

@app.get("/items/")
async def read_items(pg: Pagination = Depends()):
return {"range": f"{pg.skip}-{pg.limit}"}
  • 类依赖自动实例化,初始化参数自动绑定请求参数
  • 请求流程:
      graph TD
      A[客户端请求] --> B[FastAPI解析skip/limit参数]
      B --> C[实例化Pagination类]
      C --> D[注入read_items的pg参数]

2. 初始化参数绑定规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class ComplexFilter:
def __init__(
self,
q: str | None = None,
category: str = "all",
min_price: float = 0.0
):
self.filter = {
"q": q,
"category": category,
"min_price": min_price
}

@app.get("/products/")
async def get_products(filters: ComplexFilter = Depends()):
return filters.filter
  • 类初始化参数自动绑定顺序:
    1. 路径参数
    2. 查询参数
    3. Header参数
    4. Cookie参数
  • 支持所有参数类型注解(str/int/float等)
  • 参数验证规则与路径操作函数一致

3. 类方法扩展

1
2
3
4
5
6
7
8
9
10
class SearchParams:
def __init__(self, q: str = ""):
self.query = q

def sql_condition(self):
return f"title LIKE '%{self.query}%'" if self.query else "1=1"

@app.get("/articles/")
async def search_articles(sp: SearchParams = Depends()):
return {"sql": sp.sql_condition()}
  • 类中可定义业务逻辑方法(如生成SQL条件)
  • 支持属性计算和复杂数据处理
  • 推荐在类中实现纯业务逻辑,避免IO操作

4. 依赖项复用场景

1
2
3
4
5
6
7
8
9
10
11
12
class AuthChecker:
def __init__(self, token: str = Header(...)):
self.user = verify_token(token)

def is_admin(self):
return self.user.role == "admin"

@app.get("/admin/")
async def admin_dashboard(auth: AuthChecker = Depends()):
if not auth.is_admin():
raise HTTPException(403)
return {"status": "authorized"}
  • 跨多接口复用认证逻辑
  • 集中管理权限验证规则
  • 统一处理错误响应

5. 类依赖 vs 函数依赖

特性 类依赖 函数依赖
参数绑定方式 通过__init__方法自动绑定 显式声明参数
业务逻辑封装 支持多方法/属性扩展 单一返回值
状态管理 支持实例属性存储中间状态 无状态
适用场景 复杂参数处理/多步骤验证 简单数据转换/快速过滤