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

2024-09-04 13:36

本文主要是介绍FastAPI 中间件与依赖注入:打造灵活的 API 架构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

什么是 Depends

Depends 通常用于以下场景:

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

如何使用 Depends

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

from fastapi import Dependsdef 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 responseapp.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 推荐的依赖注入方式,因为它提供了强大的功能,如并行执行、自动错误处理和易于测试。然而,在某些情况下,其他方法可能更适合特定的需求或设计模式。

这篇关于FastAPI 中间件与依赖注入:打造灵活的 API 架构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136156

相关文章

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

一分钟带你上手Python调用DeepSeek的API

《一分钟带你上手Python调用DeepSeek的API》最近DeepSeek非常火,作为一枚对前言技术非常关注的程序员来说,自然都想对接DeepSeek的API来体验一把,下面小编就来为大家介绍一下... 目录前言免费体验API-Key申请首次调用API基本概念最小单元推理模型智能体自定义界面总结前言最

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

使用maven依赖详解

《使用maven依赖详解》本文主要介绍了Maven的基础知识,包括Maven的简介、仓库类型、常用命令、场景举例、指令总结、依赖范围、settings.xml说明等,同时,还详细讲解了Maven依赖的... 目录1. maven基础1.1 简介1.2 仓库类型1.3 常用命令1.4 场景举例1.5 指令总结

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep