FastAPI 依赖注入全解:从函数到全局作用域|附实战代码

简介: FastAPI依赖注入(DI)是其核心机制:你声明所需资源(如用户认证、数据库会话),框架自动注入。支持函数/类依赖、多级作用域(接口/路由/全局)和类型安全,实现DRY、解耦与自动文档。一句话:`Depends()` 是你的“自动工具管理员”。

🧠 什么是依赖注入(DI)?FastAPI 为何离不开它?

“你声明需要什么,框架自动准备好。”

在 FastAPI 中,依赖(Dependency) 是一段可复用的逻辑单元,例如:

  • 用户身份校验
  • 数据库会话获取
  • 请求限流/日志记录
  • 配置读取

依赖注入(Dependency Injection, DI) 就是 FastAPI 自动执行这些逻辑,并将结果(或副作用)传递给你的接口函数的过程。

优势

  • 遵循 DRY:避免每个接口重复写 if not token: raise ...
  • 解耦业务与横切关注点(cross-cutting concerns)
  • 支持多级作用域(单接口 → 路由组 → 全局)
  • 类型安全 + 自动文档生成(Swagger 自动带上依赖参数)

🎯 一句话总结:
Depends() 是 FastAPI 的“自动工具管理员”——你要锤子?它递给你;你要扳手?它也备好了。


🛠️ 实战准备:项目结构 & 环境搭建

mkdir fastapi-di-demo && cd fastapi-di-demo
python -m venv .venv
source .venv/bin/activate  # Linux/macOS;Windows 用 `.venv\Scripts\activate`
pip install 'fastapi[all]'

目录结构:

fastapi-di-demo/
├── .venv/
├── main.py              # 主应用入口(全局依赖)
├── deps.py              # 所有依赖定义(函数/类)
├── users.py             # 用户路由(演示路径/路由级依赖)
└── requirements.txt

🧩 1. 函数依赖:最常用、最直观

场景:校验用户凭据(用户名+密码)

✅ 步骤 1:定义依赖函数(deps.py

# deps.py
from fastapi import HTTPException

# 模拟用户数据库(生产环境请用 DB)
FAKE_USERS = {
   
    "alice": "pass123",
    "bob": "secret456",
}

def verify_user(name: str, password: str) -> dict:
    """✅ 函数依赖:校验用户,返回用户信息"""
    if name in FAKE_USERS and FAKE_USERS[name] == password:
        return {
   "username": name, "is_valid": True}
    raise HTTPException(status_code=401, detail="Unauthorized")

✅ 步骤 2:注入到接口(users.py

# users.py
from fastapi import APIRouter, Depends
from deps import verify_user

router = APIRouter(prefix="/users", tags=["Users"])

@router.get("/profile")
def get_profile(current_user: dict = Depends(verify_user)):
    # current_user ← verify_user() 的返回值!
    return {
   
        "message": f"Hello, {current_user['username']}!",
        "data": {
   "theme": "dark", "lang": "zh-CN"}
    }

✅ 测试(main.py 注册路由)

# main.py
from fastapi import FastAPI
from users import router as user_router

app = FastAPI()
app.include_router(user_router)

# 启动:uvicorn main:app --reload

访问:
GET /users/profile?name=alice&password=pass123
200 OK + 用户数据
GET /users/profile?name=alice&password=wrong
401 Unauthorized

💡 关键点:依赖函数的参数(name, password)会自动从请求中解析(query/form/header/path 均支持)。


🏗️ 2. 类依赖:面向对象 + 状态管理

当依赖需要配置参数维护状态时,类更合适。

场景:带自定义消息的认证器

# deps.py(追加)
from fastapi import HTTPException

class AuthGuard:
    def __init__(self, realm: str = "api"):
        self.realm = realm  # 可配置项!例如区分 admin/web/api

    def __call__(self, name: str, password: str) -> str:
        """__call__ 使实例可调用 → FastAPI 视为依赖函数"""
        if name in FAKE_USERS and FAKE_USERS[name] == password:
            return name  # 返回用户名(轻量)
        raise HTTPException(
            status_code=401,
            detail="Invalid credentials",
            headers={
   "WWW-Authenticate": f'Bearer realm="{self.realm}"'}
        )

注入使用:

# users.py(追加)
from deps import AuthGuard

# 固定 realm="protected"
guard = AuthGuard(realm="protected")

@router.get("/dashboard")
def dashboard(username: str = Depends(guard)):
    return {
   "welcome": username, "role": "user"}

✅ 优势:

  • 同一依赖可创建多个实例(如 admin_guard = AuthGuard("admin")
  • 支持 __init__ 注入配置,__call__ 执行逻辑,职责分离清晰

🌐 3. 多级依赖作用域(Scope)

作用域 写法 适用场景
接口级(带返回值) param = Depends(dep) 参数注入 需要依赖结果(如 current_user
接口级(无返回值) dependencies=[Depends(dep)] 装饰器参数 仅做检查(鉴权/限流/日志)
路由级 APIRouter(..., dependencies=[Depends(dep)]) 整组接口共享逻辑(如 /admin/* 需管理员权限)
应用级(全局) FastAPI(dependencies=[Depends(dep)]) 全站生效(如全链路日志、全局 API Key 校验)

✅ 示例 1:装饰器依赖(无返回值)

# deps.py
def log_request(name: str, password: str):
    print(f"🔍 Request from {name} at {__import__('datetime').datetime.now()}")

# users.py
@router.get("/audit", dependencies=[Depends(log_request)])
def audit():
    return {
   "status": "logged"}  # 不接收 log_request 返回值(它没 return)

✅ 示例 2:路由级依赖(整组保护)

# users.py
from deps import AuthGuard

protected_router = APIRouter(
    prefix="/admin",
    tags=["Admin"],
    dependencies=[Depends(AuthGuard("admin"))]  # ✅ 整个 /admin/* 都要认证
)

@protected_router.get("/stats")
def stats():
    return {
   "users": 1000, "active": 42}

✅ 示例 3:应用级依赖(全局日志 + 认证)

# main.py
from deps import log_request, verify_user

app = FastAPI(
    dependencies=[
        Depends(log_request),      # 所有请求记录日志
        Depends(verify_user),      # 甚至 /docs 也要求登录!⚠️ 实际慎用
    ]
)

⚠️ 注意:全局依赖会影响 Swagger UI (/docs)!若需开放文档,建议:

  • /docs 单独排除
  • 或使用中间件替代部分全局依赖

🚀 常见实战场景 & 最佳实践

场景 推荐实现方式 说明
数据库会话(SQLAlchemy) @contextmanager + Depends 确保每个请求独立 session,自动 commit/rollback
JWT 认证 类依赖 + Security() 结合 oauth2_scheme = OAuth2PasswordBearer(...)
配置管理 @lru_cache() 依赖函数 缓存 .env 读取结果,避免重复 IO
分页参数 函数依赖(skip: int = 0, limit: int = 10 统一接口分页风格
限流(Rate Limit) 装饰器依赖 + Redis 无返回值,失败直接抛 429

✅ 小结:何时该用依赖注入?

场景 用 DI? 理由
每个接口都要查用户信息 避免重复 get_user(token)
仅一个接口需特殊校验 直接写在函数里更简单
多个服务需共享 DB 连接池 统一生命周期管理
简单字符串处理(如 .upper() 过度设计

🎯 黄金法则
“重复出现 ≥ 2 次的逻辑 → 提取为依赖”
“需要与请求生命周期绑定的资源 → 必须用依赖”


相关文章
|
开发框架 JSON API
Python中FastAPI项目使用 Annotated的参数设计
Python中FastAPI项目使用 Annotated的参数设计
|
Docker Python Windows
pycharm使用fastapi/uvicorn无法reload的问题
这篇文章讨论了在PyCharm中使用FastAPI和uvicorn时遇到的无法快速重载的问题,并提供了包括降级uvicorn版本和使用命令行运行等解决方法。
pycharm使用fastapi/uvicorn无法reload的问题
|
存储 JSON 数据安全/隐私保护
"FastAPI身份验证与授权的奥秘:如何用Python打造坚不可摧的Web应用,让你的项目一鸣惊人?"
【8月更文挑战第31天】在现代Web开发中,保证应用安全性至关重要,FastAPI作为高性能Python框架,提供了多种身份验证与授权方式,包括HTTP基础认证、OAuth2及JWT。本文将对比这些机制并附上示例代码,展示如何使用HTTP基础认证、OAuth2协议以及JWT进行用户身份验证,确保只有合法用户才能访问受保护资源。通过具体示例,读者可以了解如何在FastAPI项目中实施这些安全措施。
957 1
|
SQL 存储 测试技术
SqlAlchemy 2.0 中文文档(五十七)(4)
SqlAlchemy 2.0 中文文档(五十七)
718 0
|
机器学习/深度学习 设计模式 API
Python 高级编程与实战:构建微服务架构
本文深入探讨了 Python 中的微服务架构,介绍了 Flask、FastAPI 和 Nameko 三个常用框架,并通过实战项目帮助读者掌握这些技术。每个框架都提供了构建微服务的示例代码,包括简单的 API 接口实现。通过学习本文,读者将能够使用 Python 构建高效、独立的微服务。
|
6月前
|
人工智能
大模型产生幻觉的原因,如何解决?
大模型“幻觉”指AI生成看似合理但错误或虚构的信息,源于其概率预测机制、训练数据缺陷及缺乏事实核查能力。可通过RAG、微调、联网检索、自我核查等方法降低幻觉风险,提升输出准确性与可靠性。(238字)
1981 3
|
人工智能 API Python
|
4月前
|
数据采集 人工智能 监控
AI Agent 与 Agentic AI 有什么区别?一文讲清智能体与智能代理的核心差异
本文解析AI智能体(任务驱动、规则执行)与Agentic AI(自主决策、目标生成)的本质区别:前者如Siri响应指令,后者如自动驾驶主动规划。通过智能家居、信贷审批等案例,揭示二者在自主性、任务复杂度与应用场景上的关键差异,展望Agentic AI的演进潜力。(239字)
|
运维 应用服务中间件 nginx
docker运维查看指定应用log文件位置和名称
通过本文的方法,您可以更高效地管理和查看Docker容器中的日志文件,确保应用运行状态可控和可监测。
2786 28
|
3月前
|
人工智能 IDE 开发工具
Qwen Code 周更 v0.12.4:Token 限制翻倍,多编辑器支持来袭
Qwen Code v0.13 预览版发布:Token 限制翻倍至16K,新增实时消耗显示、/context 命令查看明细;支持Zed与JetBrains系列编辑器;优化Plan Mode、.agents目录管理及会话导出统计,全面提升AI编程体验。(239字)
696 2