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
相关产品推荐
相关产品推荐

