0%

FastAPI自学教程(32) - 路径操作装饰器依赖项

1. 基础用法

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

app = FastAPI()

async def verify_token(x_token: str = Header()):
if x_token != "fake-super-secret-token":
raise HTTPException(400, "X-Token header invalid")

@app.get("/items/", dependencies=[Depends(verify_token)])
async def read_items():
return [{"item": "Foo"}, {"item": "Bar"}]
  • 通过路径操作装饰器的dependencies参数声明依赖项列表
  • 依赖项执行流程:
      graph TD
      A[客户端请求] --> B[执行verify_token]
      B --> C{验证通过?}
      C -->|是| D[执行read_items]
      C -->|否| E[返回400错误]
  • 特点:
    • 即使依赖项有返回值,也不会传递给路径操作函数
    • 多个依赖项按声明顺序执行

2. 参数配置技巧

1
2
3
4
5
6
7
8
9
@app.get(
"/secure/",
dependencies=[
Depends(verify_token, use_cache=False),
Depends(verify_key)
]
)
async def secure_endpoint():
return {"status": "secure"}
  • use_cache=False禁用依赖项缓存,强制每次重新执行
  • 支持混合使用带返回值和不返回值的依赖项
  • 依赖项可包含子依赖项,形成多层验证链

3. 错误处理机制

1
2
3
4
5
6
7
async def verify_key(x_key: str = Header()):
if x_key != "secret-key":
raise HTTPException(400, "X-Key header invalid")

@app.get("/vip/", dependencies=[Depends(verify_key)])
async def vip_route():
return {"access": "granted"}
  • 依赖项抛出HTTPException时会直接终止请求
  • 错误响应格式与普通路径操作一致:
    1
    2
    3
    {
    "detail": "X-Key header invalid"
    }
  • 支持OpenAPI文档自动生成错误响应描述

4. 生产环境最佳实践

1
2
3
4
5
6
7
def rate_limiter(redis: Redis = Depends(get_redis)):
if redis.get("requests") > 1000:
raise HTTPException(429, "Too many requests")

@app.post("/upload/", dependencies=[Depends(rate_limiter)])
async def upload_file():
return {"status": "uploaded"}
  • 典型应用场景:
    • API速率限制
    • 请求签名验证
    • 权限预检查
  • 推荐与全局依赖项配合使用(app = FastAPI(dependencies=[]))形成多层防护

5. 与全局依赖项对比

特性 路径装饰器依赖项 全局依赖项
作用范围 单路径操作 整个应用
执行顺序 全局依赖之后执行 最先执行
典型用途 细粒度权限控制 通用身份认证
性能影响 按需加载更灵活 全局生效可能增加开销
维护成本 分散在各路由 集中管理