aiohttp post请求发送后如何立即获取响应无需等待处理完成
问题核心原因
- 你当前使用的
await post.read()会阻塞等待服务端返回完整响应体后才会执行后续逻辑,只要服务端还在处理上传文件、没有返回全部响应内容,这个方法就不会结束,自然无法在请求发送完成时立刻拿到结果。 - 常见认知误区:
await session.post()执行完不代表请求已经发完、响应已经全部接收,这行代码执行完成的节点是「客户端收到服务端返回的响应头」,既不代表上传的文件已经100%发送到服务端,也不代表响应体已经接收完成。
实现方法
按照下面的逻辑调整代码即可实现需求:
- 跳过
read()这种全量读取响应的方法,在拿到响应对象的第一时间读取响应状态、响应头信息 - 如需确认文件上传完成,单独等待请求体写入完成即可,不需要等服务端处理
- 如需获取服务端处理过程中返回的中间结果,用流式逐块读取的方式接收响应,收到一块处理一块,不用等全量返回
参考代码
import asyncio import aiohttp async def post_file(): # 用上下文管理器自动管理会话生命周期,避免连接泄漏 async with aiohttp.ClientSession() as session: archive = "some file" url = "some url" # 这一步await完成时,已经拿到服务端返回的响应头 resp = await session.post(url, data=archive, ssl=False) # 此处可直接获取响应状态码、响应头,无需等服务端处理完文件 print(f"已拿到响应头,状态码:{resp.status}") # 等待请求体写入完成,即确认文件100%上传到服务端 await resp.content.writer.wait_closed() print("文件上传完成,无需等待服务端后续处理") # 如果需要接收服务端边处理边返回的中间结果,用迭代方式逐块读取 async for chunk in resp.content.iter_chunked(1024): # 每收到一块服务端返回的数据就立刻处理,不用等全部响应返回 process_data = chunk.decode("utf-8", errors="ignore") print(f"收到服务端实时返回:{process_data}") # 如果已经拿到需要的信息,直接break即可终止接收,不用等后续处理结果 asyncio.run(post_file())
注意事项
- 如果你的服务端逻辑是「必须等文件全部处理完成之后,才会返回响应头和任何响应内容」,客户端无法提前拦截到中间响应——这是HTTP协议本身的限制,这种情况需要调整服务端逻辑,让服务端在收完文件后第一时间返回响应头和接收确认信息,再边处理边流式返回进度。
- 不要在不需要全量响应的场景调用
read()、json()、text()这类方法,这类方法都会等待完整响应体接收完成才返回,会阻塞到服务端处理结束。
内容的提问来源于stack exchange,提问作者lu3si
相关产品推荐
相关产品推荐

