在aiohttp中踩到的一个坑
aiohttp的语法非常不好看,一层套一层,如果有多个请求,逻辑比较复杂,我就想把请求进行封装,比如我写了如下方法:
async def send_request(self, method, url, **kwargs):
kwargs.setdefault('allow_redirects', False)
kwargs.setdefault('timeout', 5)
async with self.session.request(method, url, **kwargs) as response:
return response
然后我希望在任意地方调用await self.send_request('GET', 'https://www.leavesongs.com')
,然后拿到response,进行后续的操作。
但是这里存在一个巨大的坑:由于存在async with
语法,这一次请求将在with块中的内容执行完后自动关闭。如果我调用了如下代码:
response = await self.send_request('GET', 'https://www.leavesongs.com')
text = await response.text()
将可能会触发Connection closed
错误(而且是一定几率触发),原因就是async with
块在执行完成以后就关闭了连接,再调用text()
方法就没意义了。
学习了,谢谢博主