aiohttp中客户端过早断开的处理

2024-10-05 11:35:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在测试aiohttp,以下代码有问题:

async def index(request: web.Request) -> web.StreamResponse:
    response = web.StreamResponse(headers={'content-type': 'text/plain'})
    await response.prepare(request)
    for i in range(1000000):
        try:
            response.write(b'test response')
            await response.drain()
        except concurrent.futures.CancelledError:
            print('Remote connection closed... Cleaning up...')
            # Do cleanup process here?
            raise

    return response

现在我用下面的curl请求来尝试一下:

^{pr2}$

然后我按Ctrl-C,让curl断开连接并停止下载响应。在

在aiohttp web服务器的控制台日志中,我得到了以下许多信息:

2017-11-08 14:42:31,295|WARNING|asyncio|socket.send() raised exception.
2017-11-08 14:42:31,295|WARNING|asyncio|socket.send() raised exception.
2017-11-08 14:42:31,295|WARNING|asyncio|socket.send() raised exception.
2017-11-08 14:42:31,295|WARNING|asyncio|socket.send() raised exception.
2017-11-08 14:42:31,295|WARNING|asyncio|socket.send() raised exception.

它一直在循环,我不能用Ctrl-C来终止服务器。我必须用kill -KILL来终止它。客户端套接字断开似乎是静默处理的。我想让asyncio.selector_events._SelectorSocketTransport.write()抛出的上述警告保持沉默。我可以通过设置适当的记录器级别使其静音,但这不是我想要的。另外,当客户机连接终止时,我想做很多清理过程。我已经看过aiohttp代码,但似乎没有任何处理程序或信号可以钩住来处理它。理想情况下,我希望能够在客户端连接关闭时进行一些清理。在

在Django中,我可以通过使用StreamingHttpResponse类创建一个自定义的SelfCleaningStream类来实现这一点。自定义的SelfCleaningStream类处理close()方法中的清理,该方法在客户端连接关闭时由Django调用。在


Tags: 代码sendwebasyncio客户端aiohttpresponserequest

热门问题