You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI中间件读取请求JSON后请求阻塞问题求助

FastAPI中间件读取请求体后请求阻塞的解决方法

问题核心在于:FastAPI的Request对象的请求体是一次性流式数据,当你在中间件中调用await request.json()时,已经将请求体的内容全部读取完毕,后续路由处理函数(包括FastAPI的参数校验逻辑)再尝试读取请求体时,会因为没有数据而陷入阻塞,导致请求一直挂起,也就无法执行到Message#2的打印逻辑。

修正后的代码

import json
from fastapi import FastAPI, Request

app = FastAPI()

@app.middleware("http")
async def log_requests(request, call_next):
    # 读取原始请求体字节
    body = await request.body()
    # 尝试解析为JSON,兼容非JSON格式请求
    try:
        req_json = json.loads(body)
    except ValueError:
        req_json = None
    
    print(f"Message#1: Request received: method:{request.method} url:{request.url}, json:{req_json}")
    
    # 将读取后的请求体重新赋值,让后续路由可正常读取
    request._body = body
    
    response = await call_next(request)
    print(f"Message#2: Response ready to be sent")
    return response

# 示例路由
@app.post("/test")
async def test_route(data: dict):
    return {"received": data}

关键说明

  • 使用request.body()读取原始字节流,而非request.json(),这样既能获取请求体内容,又能保留原始数据的控制权
  • 加入异常处理,避免非JSON格式的请求导致中间件崩溃
  • 必须将读取后的字节重新赋值给request._body,否则后续的FastAPI校验和路由处理会因为无法读取请求体而阻塞

内容的提问来源于stack exchange,提问作者sachinsdesai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 10:53:20