作者:WangQiaomei

版本:1.0(2026/3/22)

核心亮点:用 Depends 告别重复代码,让接口开发效率翻倍,新手也能秒懂!

🔥前言:为什么 Depends 是 FastAPI 的 "灵魂"?

你是不是还在每个接口里重复写「获取数据库连接」「验证用户身份」?

python

运行

# ❌ 低效重复写法
def get_user_info(request):
    # 每个接口都要写一遍:获取数据库连接
    db = get_db()
    # 每个接口都要写一遍:验证用户Token
    current_user = get_current_user()
    # ... 业务逻辑

FastAPI 的Depends依赖注入机制,直接让你告别这种 "体力活"——一行代码自动注入所需资源,错误自动处理,代码复用率拉满


🎯核心认知:Depends 到底是什么?

Depends是 FastAPI 的依赖注入神器:✅ 请求到达时,自动执行Depends()里的函数✅ 把函数返回值直接注入到接口参数中✅ 自动处理异常(比如 Token 无效直接返回 401)✅ 同一个依赖可复用在 N 个接口,彻底消灭重复代码

🌰 最直观对比:不用 Depends vs 用 Depends

❶ 不用 Depends(手动写,又笨又容易错)

python

运行

def query_user_detail(request):
    # 手动获取数据库连接
    db = get_db()
    # 手动验证当前登录用户
    current_user = get_current_login_user()
    # 手动验证用户是否为VIP
    if not current_user.is_vip:
        raise HTTPException(status_code=403, detail="非VIP用户无权限")
    # ... 真正的业务逻辑
    user_detail = db.query(User).filter(User.id == current_user.id).first()
    return user_detail
❷ 用 Depends(自动注入,简洁到离谱)

python

运行

def query_user_detail(
    current_user: User = Depends(get_current_login_user),  # 自动验证用户
    db: Session = Depends(get_db)                          # 自动获取数据库连接
):
    # 直接用注入的current_user和db,无需手动处理
    if not current_user.is_vip:
        raise HTTPException(status_code=403, detail="非VIP用户无权限")
    user_detail = db.query(User).filter(User.id == current_user.id).first()
    return user_detail

🛠️实战案例:Depends 的高频用法(直接复制即用)

案例 1:获取当前登录用户信息

python

运行

from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from backend.app.models.user import User
from backend.app.dependencies.db import get_db  # 自定义的获取数据库会话函数
from backend.app.dependencies.auth import get_current_login_user  # 自定义的验证用户函数

router = APIRouter(prefix="/user", tags=["用户管理"])

@router.get("/my-info", response_model=dict)
def get_my_info(
    # 核心:自动执行get_current_login_user(),返回值注入current_user
    current_user: User = Depends(get_current_login_user),
    # 核心:自动执行get_db(),返回值注入db
    db: Session = Depends(get_db)
):
    """
    获取当前登录用户的详细信息
    📌 请求头必须携带JWT Token:Authorization: Bearer <你的token>
    📌 Depends自动验证Token有效性,无效则返回401
    """
    # 直接使用注入的current_user和db,无需手动处理
    user_data = {
        "user_id": current_user.id,
        "username": current_user.username,
        "email": current_user.email,
        "is_vip": current_user.is_vip,
        "register_time": current_user.created_at.strftime("%Y-%m-%d %H:%M:%S")
    }
    return {"code": 200, "msg": "获取成功", "data": user_data}

案例 2:验证管理员权限(复用依赖)

python

运行

# 先定义「验证管理员」的依赖函数
def get_current_admin_user(
    current_user: User = Depends(get_current_login_user)
):
    """
    依赖函数:验证当前用户是否为管理员
    📌 可复用在所有需要管理员权限的接口
    """
    if not current_user.is_admin:
        raise HTTPException(status_code=403, detail="仅管理员可操作")
    return current_user

# 管理员专属接口:查询所有用户列表
@router.get("/list", response_model=dict)
def query_all_users(
    # 复用依赖:先验证登录,再验证管理员权限
    current_admin: User = Depends(get_current_admin_user),
    db: Session = Depends(get_db),
    page: int = 1,
    size: int = 10
):
    """
    管理员查询所有用户列表(普通用户无权限)
    📌 Depends自动完成「登录验证+管理员验证」双层校验
    """
    offset = (page - 1) * size
    total = db.query(User).count()
    users = db.query(User).offset(offset).limit(size).all()
    
    user_list = [{
        "id": user.id,
        "username": user.username,
        "is_admin": user.is_admin,
        "is_vip": user.is_vip
    } for user in users]
    
    return {
        "code": 200,
        "msg": "查询成功",
        "data": {
            "total": total,
            "page": page,
            "size": size,
            "list": user_list
        }
    }

📚Depends 的 4 大核心优势(新手必记)

1. 代码极致简洁

  • 告别每个接口重复写「获取 DB」「验证用户」
  • 核心业务逻辑之外的 "杂活",Depends 全帮你干了

2. 自动处理异常

  • Token 无效 / 过期 → 自动返回 401 Unauthorized
  • 权限不足 → 自动返回 403 Forbidden
  • 无需手动写 try/except 捕获这类通用异常

3. 超高复用性

  • 一个依赖函数(如get_current_admin_user)可复用在所有管理员接口
  • 后期修改逻辑(比如新增 VIP 权限验证),只需改一处依赖函数,所有接口自动生效

4. 测试超级方便

  • 测试时可直接替换依赖(比如用模拟的mock_db替换真实get_db
  • 无需修改接口代码,即可实现 "无侵入式测试"

🚩避坑指南(新手 90% 会踩的坑)

  1. 依赖函数必须有返回值:Depends 是把函数返回值注入参数,无返回值会导致参数为 None
  2. 依赖函数支持嵌套:比如get_current_admin_user里可以嵌套get_current_login_user,Depends 会自动逐层执行
  3. Depends 参数是函数名,不是函数调用:正确写法Depends(get_db),错误写法Depends(get_db())
  4. 数据库依赖要注意会话关闭:建议用yield实现get_db,FastAPI 会自动关闭会话

    python

    运行

    def get_db():
        db = SessionLocal()
        try:
            yield db  # 注入给接口使用
        finally:
            db.close()  # 请求结束自动关闭
    

🎯总结

Depends是 FastAPI 最核心、最实用的特性之一:

  1. 本质是依赖注入,自动执行函数并注入返回值;
  2. 核心价值是去重复、提效率、易维护
  3. 高频场景:数据库会话、用户验证、权限校验、参数解析;
  4. 新手记住:Depends 传函数名,不是函数调用,异常会自动处理!

想要进阶教程?留言告诉我:

✅ 如何写带参数的依赖函数

✅ 如何实现依赖缓存(避免重复执行)

✅ 如何批量注册全局依赖

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐