Skip to content

依赖注入

8.1 依赖注入介绍

FastAPI 的依赖注入系统是其核心功能之一,它使得构建应用程序更加模块化、可测试和可维护。依赖注入(Dependency Injection, DI)是一种设计模式,用于实现控制反转(Inversion of Control, IoC),它允许将类或函数的依赖项从外部注入,而不是在内部创建。

FastAPI 使用 Depends 类来声明依赖项。Depends 是一个类,你可以在路径操作函数(或其它依赖项)的参数中使用它来声明需要注入的依赖。

依赖注入的常见应用场景:

  • 共享业务逻辑:将多个路由都需要执行的逻辑抽象出来,避免代码重复。
  • 共享数据库连接:管理数据库会话的创建、使用和关闭。
  • 安全和认证:实现用户身份验证、权限检查和角色要求等。
  • 处理请求参数:从请求中提取和验证查询参数、路径参数或请求体

主要优势

  1. 代码复用:相同的依赖可以在多个路径操作中使用
  2. 清晰的依赖关系:明确显示每个端点需要什么
  3. 易于测试:可以轻松地用模拟依赖替换真实依赖
  4. 自动文档:依赖项会自动包含在 API 文档中
  5. 错误处理:依赖项中的异常会自动处理

8.2 基本使用

I. 定义依赖的函数逻辑

比如定义一个获取mysql连接对象的函数

1
2
3
4
def get_db():
    # 模拟创建数据库连接
    db = '一个数据库连接'
    return db

II. 在路由匹配中使用

使用Depends类进行依赖注入,将get_db函数注入到一个路由匹配中

from fastapi import Depends

@app.get("/books/")
def read_books(db=Depends(get_db)):
    # 模拟获取一个数据库连接
    print(db)
    return {"books": [{"title": "Book 1"}, {"title": "Book 2"}]}

@app.get("/heros/")
def read_heros(db=Depends(get_db)):
    # 模拟获取一个数据库连接
    print(db)
    return {"books": [{"title": "Hero 1"}, {"title": "Hero 2"}]}

每个路由匹配中都会调用都会get_db获取一个数据库连接,数据库操作互不影响

总的来说,依赖注入相当于在执行路由匹配时,会自动执行注入的函数,进而获取该函数返回结果值。