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

Python 的 FastApi 如何在request 重复取request.body()

需求背景:

需要再中间件中获取body 中的信息 但是 又想要在之后 还可以重复取 这个body 因为有的接口写法是直接从body中获取参数,然而这个body是数据流的形式,一旦取一次就导致后面取不到里面的值了 。

解决方式:

1.保存请求体

在中间件中读取请求体后,将其保存到一个变量中,并将其附加到请求中,以便后续处理函数可以访问。

from fastapi import FastAPI, Request
from starlette.middleware.base import BaseHTTPMiddleware
from starlette.middleware.cors import CORSMiddlewareapp = FastAPI()class CustomMiddleware(BaseHTTPMiddleware):async def dispatch(self, request: Request, call_next):# 读取请求体body = await request.body()  # 获取原始请求体request._body = body  # 将其附加到请求对象# 继续处理请求response = await call_next(request)return response# 添加中间件
app.add_middleware(CustomMiddleware)@app.post("/items/")
async def create_item(request: Request):# 读取请求体body = await request.json()  # 现在可以安全读取return {"body": body}

但是这里有点问题  如果create_item(request: Request) 是这样的写法 create_item(xxx: xxx = Body()) 这里会默认的从body中读取数据而不是我们重新放进去的 _body ,而这用用法比较多的时候我们改动范围比较大所以需要第二种方式实现

2.将body原路塞回去

class LoggingMiddleware(BaseHTTPMiddleware):async def dispatch(self, request: Request, call_next):request_body = await request.body()# 定义一个新的 receive 方法,返回缓存的请求体async def receive():return {"type": "http.request", "body": request_body}# 替换请求的 _receive 方法request._receive = receive

这样做的话再其他的地方再次调用 request.body()了  不需要大范围的修改 create_item(xxx: xxx = Body()) 这种写法了

http://www.lryc.cn/news/479417.html

相关文章:

  • qt QFontDialog详解
  • AI时代,通才可能会占据更有利的地位
  • qt QHeaderView详解
  • 探索PickleDB:Python中的轻量级数据存储利器
  • yocto下编译perf失败的解决方法
  • 丹摩征文活动|详解 DAMODEL(丹摩智算)平台:为 AI 开发者量身打造的智算云服务
  • ORACLE _11G_R2_ASM 常用命令
  • 掌握Rust模式匹配:从基础语法到实际应用
  • HFSS 3D Layout中Design setting各个选项的解释
  • 线性表之链表详解
  • C/C++使用AddressSanitizer检测内存错误
  • 【EI和Scopus检索】国际人工智能创新研讨会(IS-AII 2025)
  • 在OceanBase 中,实现自增列的4种方法
  • LWE算法分类及基本加解密算法示例
  • 【论文阅读】Learning dynamic alignment via meta-filter for few-shot learning
  • 蓝牙 SPP 协议详解及 Android 实现
  • 系统学习领域驱动设计-感悟-高尚名词篇
  • 人工智能(AI)和机器学习(ML)技术学习流程
  • <Project-20 YT-DLP> 给视频网站下载工具 yt-dlp/yt-dlp 加个页面 python web
  • 【Android】Gradle 7.0+ 渠道打包配置
  • Web应用性能测试工具 - httpstat
  • MySQL 【流程控制】函数
  • python 天气数据可视化
  • 【HarmonyOS Next】数据本地存储:@ohos.data.preferences
  • 使用BaGet快速搭建nuget服务
  • 基于Zynq FPGA的雷龙SD NAND存储芯片性能测试
  • 【功能介绍】信创终端系统上各WPS版本的授权差异
  • Neo4j 和 Python 初学者指南:如何使用可选关系匹配优化 Cypher 查询
  • 性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
  • (vue3)在Pinia Store中正确使用Vue I18n