当前位置: 首页 > news >正文

FastAPI-依赖注入

一、什么是依赖注入

依赖注入(Dependency Injection)是一种设计模式,用于管理组件之间的依赖关系。在 FastAPI 中,它用于:

  • 共享数据库连接
  • 强制执行安全性和认证
  • 参数验证
  • 代码复用

二、基础依赖

from fastapi import Depends, FastAPI app = FastAPI() # 简单依赖函数 def common_parameters(q: str = None, skip: int = 0, limit: int = 100): return {"q": q, "skip": skip, "limit": limit} @app.get("/items/") async def read_items(commons: dict = Depends(common_parameters)): return commons @app.get("/users/") async def read_users(commons: dict = Depends(common_parameters)): return commons

三、类作为依赖

from fastapi import Depends class CommonQueryParams: def __init__(self, q: str = None, skip: int = 0, limit: int = 100): self.q = q self.skip = skip self.limit = limit @app.get("/items/") async def read_items(commons: CommonQueryParams = Depends()): # 自动推断依赖类型 return { "q": commons.q, "skip": commons.skip, "limit": commons.limit }

四、多层依赖

from fastapi import Depends, HTTPException, status # 第一层:获取 token def get_token(token: str = Header()): return token # 第二层:验证 token,依赖第一层 def verify_token(token: str = Depends(get_token)): if token != "secret-token": raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid token" ) return token # 第三层:获取当前用户,依赖第二层 async def get_current_user( token: str = Depends(verify_token), db: AsyncSession = Depends(get_db) ): # 根据 token 查询用户 user = await get_user_by_token(db, token) if not user: raise HTTPException(status_code=404, detail="User not found") return user # 路由使用最终依赖 @app.get("/users/me") async def read_current_user(current_user = Depends(get_current_user)): return current_user

五、 全局依赖

# 应用级依赖(所有路由都会执行) app = FastAPI(dependencies=[Depends(verify_token)]) # 路由级依赖(某个路由组的所有端点) router = APIRouter( prefix="/admin", dependencies=[Depends(verify_admin)] )

六、yield 依赖

async def get_db(): db = AsyncSessionLocal() try: yield db # 使用 yield 而非 return finally: await db.close() # 请求完成后自动清理 @app.get("/users/") async def get_users(db: AsyncSession = Depends(get_db)): # db 使用完毕后会自动关闭 return await get_all_users(db)

七、依赖缓存

from fastapi import Depends # 默认情况下,同一个请求中多次调用同一依赖,会被缓存 async def expensive_operation(): # 昂贵的计算 return "result" @app.get("/test") async def test_endpoint( # 两次调用,但只执行一次 result1 = Depends(expensive_operation), result2 = Depends(expensive_operation) ): return {"result1": result1, "result2": result2} # 禁用缓存 @app.get("/test2") async def test_endpoint2( result = Depends(expensive_operation, use_cache=False) ): return {"result": result}
http://www.jsqmd.com/news/534549/

相关文章:

  • 幻兽帕鲁存档迁移难题终结方案:palworld-host-save-fix的GUID智能替换技术应用指南
  • JS 入门通关手册(27):ES6+ 高频新特性:解构、展开、模板字符串、可选链
  • 百度:统一端到端文档解析Qianfan-OCR
  • 2026终端对决:OpenClaw VS Chaterm
  • HunyuanVideo-Foley部署案例:高校媒体实验室AI音效教学平台搭建
  • 2026买商标找哪家商标公司靠谱?实测出炉,甄标网断层领先 - 资讯焦点
  • 复调制频谱细化(Zoom-FFT)保姆级教程:从原理到MATLAB代码逐行解析
  • 4个核心步骤:飞桨PaddlePaddle深度学习框架从入门到环境部署
  • 不止于部署:在华为昇腾服务器上,如何用Docker和MindIE高效管理多个Qwen模型实例
  • 从战神到微服务:用Go-Kratos v2快速搭建你的第一个‘Hello World’服务
  • Wan2.2-I2V-A14B部署案例:中小企业低成本搭建私有AI视频生成平台
  • CLIP ViT-H/14模型架构深度解析:从20亿数据到零样本视觉语言理解
  • Qwen-Image-Edit入门必看:本地化部署+隐私保障+像素级编辑三合一详解
  • 模糊控制跟踪mppt: 采样电池电压,电流,根据模糊规则,跟踪控制达到最大功率点mppt,波形...
  • 跨平台虚拟机工具:解锁macOS系统的开源解决方案
  • 3大维度优化AI内存管理:让苹果芯片训练效率提升40%
  • 2026年浴室柜推荐:四大热门品牌横评,浴室柜怎么选 - 资讯焦点
  • Kimi K2大模型本地部署:如何在普通电脑上运行千亿参数AI助手
  • 即时通讯私有化数据能实现完全自主可控吗?
  • 小米智能家居 Home Assistant 集成指南:从安装到配置的零门槛实践
  • 如何用League Akari轻松提升英雄联盟游戏体验:完整指南
  • 嵌入式开发调试信息输出方法详解
  • CoPaw模型处理长文本摘要与报告生成效果对比分析
  • 5G WiFi频段为什么不能随便用?从信道限制看各国无线电安全政策差异
  • Python算法宝库:从机器学习到科学计算的完整实现指南
  • STM32景区智能服务系统设计与实现
  • 突破文本边界:SillyTavern多模态交互的创新实践
  • 当YOLO遇上FPGA:16路人脸检测的暴力美学
  • 从油电耦合逻辑到动力分配算法,Dmi混动系统的仿真总让人头秃。今天咱们直接扒开Simulink模型的外壳,看看这套正向开发框架怎么把混动车的灵魂装进代码里
  • R方小于0?别慌!手把手教你诊断线性回归模型的5个常见问题