为什么FastAPI添加打印HTTP请求体的middleware后会挂起无响应
FastAPI中间件读取请求体后无响应问题解决
问题原因
FastAPI 的 Request 对象请求体是流式读取的,在中间件中调用 await request.body() 会一次性消费完请求体流,后续路由层解析请求参数时无法再次读取到数据,会一直处于等待状态,最终导致客户端无响应返回。
修复方案
读完请求体后,手动将请求体重新写入 Request 对象的接收方法,让后续流程可以正常读取请求数据。
修改后的中间件代码
@app.middleware('http') async def debug_request(request: Request, call_next): _body = await request.body() print(_body) # 将已读取的请求体重新塞回 request,供后续链路使用 async def receive_override(): return {"type": "http.request", "body": _body, "more_body": False} request._receive = receive_override response = await call_next(request) return response
验证
修改完成后重启服务端,客户端可正常收到 {"detail": "ok"} 响应,同时中间件也能正常打印请求体内容。
内容的提问来源于stack exchange,提问作者Hobin C.
相关产品推荐
相关产品推荐

