FastAPI依赖注入:参数共享与逻辑复用

news/2025/3/16 15:00:20/文章来源:https://www.cnblogs.com/Amd794/p/18774999

image

image

扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长


第一章:依赖注入核心原理

1.1 依赖树构建机制

from fastapi import Dependsdef auth_service():return OAuth2Scheme()def db_conn(auth: dict = Depends(auth_service)):return Database(creds=auth)@app.get("/data")
async def get_data(conn=Depends(db_conn)):return conn.query()

依赖树可视化

graph TD get_data --> db_conn --> auth_service

1.2 作用域控制

from fastapi import Depends, FastAPI
from sqlalchemy.orm import sessionmakerSessionLocal = sessionmaker(autocommit=False)# 请求级作用域
def get_db():db = SessionLocal()try:yield dbfinally:db.close()# 应用级单例
cache = LRUCache(size=100)def get_cache():return cache

第二章:Pydantic深度集成

2.1 动态模型注入

from pydantic import create_modeldef dynamic_model(fields: dict):return create_model('DynamicModel', **fields)class FilterFactory:@classmethoddef create(cls, model: BaseModel):class QueryParams(model):limit: int = 100offset: int = 0return QueryParams@app.get("/search")
async def search(params=Depends(FilterFactory.create(User))):return params.dict()

2.2 校验逻辑复用

from pydantic import validator, root_validatorclass GeoValidator:@classmethoddef lat_validator(cls, v):if not -90 <= v <= 90:raise ValueError("纬度范围错误")return vclass Location(BaseModel):lat: floatlng: float_validate_lat = validator('lat', allow_reuse=True)(GeoValidator.lat_validator)

第三章:高级注入模式

3.1 工厂模式注入

class NotificationClient:def __init__(self, type: str):self.client = self._create_client(type)@staticmethoddef _create_client(type):return {"sms": SMSClient(),"email": EmailClient()}[type]def get_notifier(type: str):def _factory():return NotificationClient(type)return _factory@app.post("/alert")
async def send_alert(notifier: NotificationClient = Depends(get_notifier("sms"))
):notifier.client.send()

3.2 条件依赖注入

from fastapi import Headerdef feature_flag_dep(feature_name: str):class FeatureChecker:def __init__(self,enabled: bool = Depends(check_feature_enabled)):if not enabled:raise HTTPException(403, "功能未启用")return FeatureCheckerdef check_feature_enabled(feature: str = Header(...),config: Config = Depends(get_config)
) -> bool:return config.is_enabled(feature)@app.get("/beta")
async def beta_feature(checker=Depends(feature_flag_dep("beta"))
):return "功能可用"

第四章:错误处理与调试

4.1 依赖链错误传播

class DatabaseError(Exception):passdef db_dep():try:yield connectionexcept Exception as e:raise DatabaseError() from e@app.exception_handler(DatabaseError)
async def handle_db_error(request, exc):return JSONResponse(500, {"detail": "数据库异常"})

4.2 依赖图可视化调试

from fastapi.dependencies.utils import solve_dependenciesdef print_dependency_tree():routes = app.routesfor route in routes:if isinstance(route, APIRoute):solved = solve_dependencies(route.dependant)print(f"Route {route.path}:")for dep in solved.flat_graph():print(f"└─ {dep.call.__name__}")

第五章:测试与维护

5.1 依赖覆盖测试

from fastapi.testclient import TestClientdef override_dep():return MockDatabase()app.dependency_overrides[get_db] = override_depclient = TestClient(app)
response = client.get("/data")
assert "mock" in response.text

5.2 依赖版本管理

from packaging.version import parseclass VersionedDep:def __init__(self, api_version: str = Header(...)):self.version = parse(api_version)def check_min_version(self, min_version: str):if self.version < parse(min_version):raise HTTPException(400, "版本过低")@app.get("/new-feature")
async def new_feature(dep: VersionedDep = Depends(),checker=Depends(dep.check_min_version("2.3"))
):return "功能可用"

课后Quiz

Q1:如何实现跨路由共享查询参数?
A) 在每个路由重复定义参数
B) 使用全局变量存储参数
C) 通过依赖注入共享参数

Q2:依赖注入的yield语句有什么作用?

  1. 实现请求后清理逻辑
  2. 提高依赖执行速度
  3. 支持异步生成器

Q3:如何测试被覆盖的依赖项?


错误解决方案速查表

错误类型 解决方案
422 Validation Error 检查请求参数是否匹配Pydantic模型定义
DIResolutionError 确认依赖树没有循环引用,所有依赖项已正确定义
DependencyInstantiationError 检查yield依赖是否正确处理异常,验证上下文管理器实现

扩展阅读

  1. 《Dependency Injection Principles》 - 依赖注入设计原则深度解析
  2. 《Clean Architecture in Python》 - Python整洁架构实践指南
  3. 《FastAPI Internals》 - 框架源码分析与实现原理

架构箴言:优秀的依赖注入设计应遵循SOLID原则,特别是依赖倒置原则(DIP)。建议使用依赖图分析工具保持注入层次不超过5层,对高频依赖实施缓存策略,并定期进行依赖关系审计。

探索数千个预构建的 AI 应用,开启你的下一个伟大创意

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完整的文章:FastAPI依赖注入:参数共享与逻辑复用 | cmdragon's Blog

往期文章归档:

  • FastAPI安全防护指南:构建坚不可摧的参数处理体系 | cmdragon's Blog
  • FastAPI复杂查询终极指南:告别if-else的现代化过滤架构 | cmdragon's Blog
  • FastAPI 核心机制:分页参数的实现与最佳实践 | cmdragon's Blog
  • FastAPI 错误处理与自定义错误消息完全指南:构建健壮的 API 应用 🛠️ | cmdragon's Blog
  • FastAPI 自定义参数验证器完全指南:从基础到高级实战 | cmdragon's Blog
  • FastAPI 参数别名与自动文档生成完全指南:从基础到高级实战 🚀 | cmdragon's Blog
  • FastAPI Cookie 和 Header 参数完全指南:从基础到高级实战 🚀 | cmdragon's Blog
  • FastAPI 表单参数与文件上传完全指南:从基础到高级实战 🚀 | cmdragon's Blog
  • FastAPI 请求体参数与 Pydantic 模型完全指南:从基础到嵌套模型实战 🚀 | cmdragon's Blog
  • FastAPI 查询参数完全指南:从基础到高级用法 🚀 | cmdragon's Blog
  • FastAPI 路径参数完全指南:从基础到高级校验实战 🚀 | cmdragon's Blog
  • FastAPI路由专家课:微服务架构下的路由艺术与工程实践 🌐 | cmdragon's Blog
  • FastAPI路由与请求处理进阶指南:解锁企业级API开发黑科技 🔥 | cmdragon's Blog
  • FastAPI路由与请求处理全解:手把手打造用户管理系统 🔌 | cmdragon's Blog
  • FastAPI极速入门:15分钟搭建你的首个智能API(附自动文档生成)🚀 | cmdragon's Blog
  • HTTP协议与RESTful API实战手册(终章):构建企业级API的九大秘籍 🔐 | cmdragon's Blog
  • HTTP协议与RESTful API实战手册(二):用披萨店故事说透API设计奥秘 🍕 | cmdragon's Blog
  • 从零构建你的第一个RESTful API:HTTP协议与API设计超图解指南 🌐 | cmdragon's Blog
  • Python异步编程进阶指南:破解高并发系统的七重封印 | cmdragon's Blog
  • Python异步编程终极指南:用协程与事件循环重构你的高并发系统 | cmdragon's Blog
  • Python类型提示完全指南:用类型安全重构你的代码,提升10倍开发效率 | cmdragon's Blog
  • 三大平台云数据库生态服务对决 | cmdragon's Blog
  • 分布式数据库解析 | cmdragon's Blog
  • 深入解析NoSQL数据库:从文档存储到图数据库的全场景实践 | cmdragon's Blog
  • 数据库审计与智能监控:从日志分析到异常检测 | cmdragon's Blog
  • 数据库加密全解析:从传输到存储的安全实践 | cmdragon's Blog
  • 数据库安全实战:访问控制与行级权限管理 | cmdragon's Blog
  • 数据库扩展之道:分区、分片与大表优化实战 | cmdragon's Blog
  • 查询优化:提升数据库性能的实用技巧 | cmdragon's Blog
  • 性能优化与调优:全面解析数据库索引 | cmdragon's Blog
  • 存储过程与触发器:提高数据库性能与安全性的利器 | cmdragon's Blog
  • 数据操作与事务:确保数据一致性的关键 | cmdragon's Blog
  • 深入掌握 SQL 深度应用:复杂查询的艺术与技巧 | cmdragon's Blog
  • 彻底理解数据库设计原则:生命周期、约束与反范式的应用 | cmdragon's Blog
  • 深入剖析实体-关系模型(ER 图):理论与实践全解析 | cmdragon's Blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/899812.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛谷-P1449 后缀表达式

重操旧业~ 本菜鸡看到题就只会想到数组,但后来发现不可行,出去俩元素,还得进来一个元素,不好调o(╥﹏╥)o emm...但还是有所收获的,2转2,利用2-0,而不是直接强制int转换哦 同时也发现被题中举的例子迷惑了,数字可不一定是个位数! 1、此题采用栈和二叉树的后序遍历思想(…

DQL(查询语句)

简单查询 查询一个字段 select 字段名 from 表名; 查询多个字段 select 字段名1,字段名2,...,字段名 from 表名; 查询全部字段 ①在查询多个字段中,将所有的字段名写入 ②select * from 表名;————效率低,可读性差,因为将星号转化为所有字段名需要耗费一定时间,所…

PTA

​ 题目描述 小轿车中有一个系统随时监测四个车轮的胎压,如果四轮胎压不是很平衡,则可能对行车造成严重的影响。让我们把四个车轮 —— 左前轮、右前轮、右后轮、左后轮 —— 顺次编号为 1、2、3、4。本题就请你编写一个监测程序,随时监测四轮的胎压,并给出正确的报警信息。…

第二章

TempStr = input("请输入带有符号的温度值:") if isinstance(TempStr, str) and TempStr[-1] in [F, f]:C = int((float(TempStr[0:-1]) - 32) / 1.8)print(f"转换后的温度是{C}C") elif isinstance(TempStr, str) and TempStr[-1] in [C, c]:F = int(1.8…

window11家庭版 WSL上安装CentOS7

环境 Windows11家庭版 1. 安装WSL配置 1.1 Win命令模式开启虚拟化步骤点击查看代码 # 启用适用于 Linux 的 Windows 子系统:打开powershell并输入: dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart# 启用虚拟化:以管理员打…

探秘Transformer系列之(14)--- 残差网络和归一化

从零开始解析Transformer,目标是:(1) 解析Transformer如何运作,以及为何如此运作,让新同学可以入门;(2) 力争融入一些比较新的或者有特色的论文或者理念,让老鸟也可以有所收获。探秘Transformer系列之(14)--- 残差网络和归一化 目录探秘Transformer系列之(14)--- 残差…

省选联考2024游记

搬运自 洛谷博客 ,文章写于 2024.03.05“总有地上的生灵,敢于直面雷霆的威光。”全文共1169字。 Day -105 2023/11/18 noip考完人就崩了,第二题甚至都没写出正解,只有压线省一,大哭。 也基本注定这回是进不了省队了。 Day -5 2024/2/26 周一 开始停课 Day -4 2024/2/27 周…

day30 正则三剑客---awk

awk是什么 再谈三剑客grep,擅长单纯的查找或匹配文本内容 sed,更适合编辑、处理匹配到的文本内容 awk,更适合格式化文本内容,对文本进行复杂处理后、更友好的显示三个命令称之为Linux的三剑客 awk学完后的能力 以下部分内容需要结合shell编程对文本行数据提取数据字段 模式…

树上查分学习笔记+做题记录

树上查分 点的查分求路径 \(u-v\) 上的点被经过的次数. \(cnt[x]\) 表示点 \(x\) 被经过的次数. 核心代码:cnt[u]++; cnt[v]++; cnt[lca(u,v)]--; cnt[father[lca(u,v)]]--;A. 运输压力解法 树上查分板子题啊 #include <bits/stdc++.h> using namespace std; const int N…

ActAgent开发之基于http请求引用链路模版发起对话

下载deepeek 首先本地安装ollama,这是一款支持mac,windows和linus系统的大模型管理工具。下载好后打开终端,执行命令ollama pull deepseek-r1:7b,可以在网上找想要下载的开源大模型,我这里下载的是deepseek-r1的7b模型。执行完后可以用ollama list查看是否下载成功,然后可…

缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)

说在前面 在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的redis一致性面试题,类似如下:如何保障 MySQL 和 Redis 的数据一致性? 如何保障 MySQL 和 Cache 的数据一…

牛逼,这款开源聊天应用竟能一键召唤多个AI助手,跨平台通话神器!

`JiwuChat`是一款基于Tauri2和Nuxt3构建的轻量化多平台即时通讯工具,仅约8MB体积却集成了**AI群聊机器人**、**WebRTC音视频通话**、**屏幕共享**等前沿功能。一套代码适配Windows/macOS/Linux/Android/iOS/Web六大平台,堪称开发者学习跨端开发的绝佳样板!嗨,大家好,我是小…