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()方法就没意义了。