FastAPI 中间件与依赖注入:打造灵活的 API 架构

在 FastAPI 中,Depends 是一个非常重要的概念,它用于依赖注入。依赖注入是一种设计模式,允许你将组件(如函数、类或服务)之间的依赖关系明确地表达出来,而不是硬编码在组件内部。这使得代码更加模块化、可测试和易于维护。

什么是 Depends

Depends 通常用于以下场景:

  1. 参数注入:将参数注入到路由处理函数中。
  2. 服务注入:将服务或工具类的实例注入到路由处理函数中。
  3. 前置验证:在路由处理函数执行之前执行验证逻辑。

如何使用 Depends

Depends 通常与路由处理函数的参数一起使用,如下所示:

from fastapi import Depends

def get_query(token: str = Depends(your_dependency_function)):
    return token

@app.get("/items/")
async def read_items(query: str = Depends(get_query)):
    return {"query": query}

在这个例子中,your_dependency_function 是一个依赖项函数,它返回一个值,该值将被注入到 get_query 函数中,然后 get_query 函数的返回值又被注入到路由处理函数 read_items 中。

依赖项函数

依赖项函数可以是任何返回值的异步或同步函数。它们可以执行各种任务,如:

  • 验证请求数据。
  • 从数据库中获取数据。
  • 执行复杂的计算。
  • 调用外部服务。

依赖项的嵌套

你可以将 Depends 用于嵌套依赖项,这意味着一个依赖项函数可以依赖于另一个依赖项函数:

def dependency_a():
    return "A"

def dependency_b(a: str = Depends(dependency_a)):
    return a + "B"

@app.get("/items/")
async def read_items(b: str = Depends(dependency_b)):
    return {"b": b}

依赖项的并行执行

FastAPI 能够并行执行依赖项函数,这意味着如果多个参数都依赖于相同的依赖项函数,FastAPI 会执行一次该函数,并将结果注入到所有参数中,从而提高效率。

依赖项的错误处理

如果依赖项函数抛出异常,FastAPI 会自动处理这些异常,并返回适当的 HTTP 响应。这使得错误处理更加简洁和集中。

其他实现依赖注入

在 FastAPI 中,Depends 是实现依赖注入的主要方式,但它并不是唯一的方法。以下是一些其他可以实现依赖注入的技术和方法:

  1. 直接参数传递
    你可以直接将依赖项作为参数传递给路由处理函数,而不是使用 Depends

    def some_dependency():
        return "dependency value"
    
    @app.get("/items/")
    async def read_items(dependency_value: str = some_dependency()):
        return {"dependency": dependency_value}
    
  2. 使用类
    通过创建类并使用其实例作为依赖项,可以利用面向对象的编程方法来管理依赖关系。

    class DependencyInjector:
        def get_dependency(self):
            return "dependency value"
    
    injector = DependencyInjector()
    
    @app.get("/items/")
    async def read_items(dependency_value: str = injector.get_dependency()):
        return {"dependency": dependency_value}
    
  3. 全局状态
    虽然不推荐,但可以通过全局变量或单例模式来存储和访问依赖项。

    dependency_value = "dependency value"
    
    @app.get("/items/")
    async def read_items(dependency_value: str = dependency_value):
        return {"dependency": dependency_value}
    
  4. 中间件
    在 FastAPI 中,你可以使用中间件来处理请求和响应。中间件可以在请求处理流程中的特定点注入依赖项。

    async def inject_dependency(request: Request, call_next):
        request.state.dependency = "dependency value"
        response = await call_next(request)
        return response
    
    app.add_middleware(Middleware, inject_dependency)
    
  5. 依赖提供者
    类似于 Depends,你可以创建自定义的依赖提供者函数,这些函数可以在内部处理复杂的依赖逻辑。

    def custom_dependency_provider():
        return "custom dependency value"
    
    @app.get("/items/")
    async def read_items(dependency_value: str = custom_dependency_provider()):
        return {"dependency": dependency_value}
    
  6. 工厂函数
    你可以定义工厂函数来创建依赖项,这些函数可以在需要时生成新的依赖项实例。

    def create_dependency():
        class Dependency:
            def __init__(self):
                self.value = "dependency value"
        return Dependency()
    
    @app.get("/items/")
    async def read_items(dependency: Dependency = Depends(create_dependency)):
        return {"dependency": dependency.value}
    
  7. 数据库会话管理
    对于数据库依赖,你可以使用数据库会话或 ORM 工具的上下文管理器来确保依赖项的正确注入和生命周期管理。

    from sqlalchemy.orm import Session
    
    @app.get("/items/")
    async def read_items(db: Session = Depends(get_db)):
        return {"items": [item async for item in db.query(Item)]}
    

每种方法都有其适用场景和优缺点。Depends 是 FastAPI 推荐的依赖注入方式,因为它提供了强大的功能,如并行执行、自动错误处理和易于测试。然而,在某些情况下,其他方法可能更适合特定的需求或设计模式。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
森林防火应急联动指挥系统是一个集成了北斗定位/GPS、GIS、RS遥感、无线网络通讯、4G网络等技术的现代化智能系统,旨在提高森林火灾的预防和扑救效率。该系统通过实时监控、地图服务、历史数据管理、调度语音等功能,实现了现场指挥调度、语音呼叫通讯、远程监控、现场直播、救火人员生命检测等工作的网络化、智能化、可视化。它能够在火灾发生后迅速组网,确保现场与指挥中心的通信畅通,同时,系统支持快速部署,适应各种极端环境,保障信息的实时传输和历史数据的安全存储。 系统的设计遵循先进性、实用性、标准性、开放性、安全性、可靠性和扩展性原则,确保了技术的领先地位和未来的发展空间。系统架构包括应急终端、无线专网、应用联动应用和服务组件,以及安全审计模块,以确保用户合法性和数据安全性。部署方案灵活,能够根据现场需求快速搭建应急指挥平台,支持高并发视频直播和大容量数据存储。 智能终端设备具备三防等级,能够在恶劣环境下稳定工作,支持北斗+GPS双模定位,提供精确的位置信息。设备搭载的操作系统和处理器能够处理复杂的任务,如高清视频拍摄和数据传输。此外,设备还配备了多种传感器和接口,以适应不同的使用场景。 自适应无线网络是系统的关键组成部分,它基于认知无线电技术,能够根据环境变化动态调整通讯参数,优化通讯效果。网络支持点对点和点对多点的组网模式,具有低功耗、长距离覆盖、强抗干扰能力等特点,易于部署和维护。 系统的售后服务保障包括安装实施服务、系统维护服务、系统完善服务、培训服务等,确保用户能够高效使用系统。提供7*24小时的实时故障响应,以及定期的系统优化和维护,确保系统的稳定运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值