aiohttp.ClientSession异步请求无报错卡住的原因及解决方法
问题原因及修复方案
核心原因
json参数使用错误:你手动用json.dumps()把字典转成了JSON字符串,但aiohttp.ClientSession.post()的json参数原生支持Python字典对象,aiohttp会自动完成JSON序列化并设置正确的请求头。传字符串会导致aiohttp将其作为普通文本发送,加上你手动设置的Content-Type: application/json,服务器无法正确解析请求体,进而导致请求一直处于等待状态,程序卡住。- 冗余请求头设置:当使用
json参数时,aiohttp会自动添加Content-Type: application/json请求头,手动设置的该头属于冗余操作,甚至可能引发编码相关的额外问题。
修正后的代码
import aiohttp from aiohttp import ClientTimeout # 假设self.cfg已正确定义 url = self.cfg['baseUrl'] async with aiohttp.ClientSession(timeout=ClientTimeout(300)) as session: data = {"data": ["a", "b", "c"]} # 直接传入Python字典 try: print("before request") async with session.post(url=url, json=data) as response: print("after request") # 先校验响应状态码,避免非JSON响应引发解析错误 if response.status == 200: result = await response.json() print(result) else: print(f"请求失败,状态码: {response.status}") print(await response.text()) except Exception as ex: print(f"请求异常: {ex}")
额外注意事项
- 确保异步代码在事件循环中运行:如果这段代码是在普通函数中调用,需要用
asyncio.run()启动事件循环,示例如下:import asyncio async def main(): # 上述异步请求代码放在此处执行 if __name__ == "__main__": asyncio.run(main()) - 合理调整超时时间:300秒的超时过长,建议根据业务场景缩短(比如设置为10秒),能更快定位问题。
内容的提问来源于stack exchange,提问作者user26963098
相关产品推荐
相关产品推荐

