2016-03-29 6 views
4

У меня есть длинный запрос, в течение которого я отправляю данные до клиента по мере его получения. Однако для запроса требуются некоторые ресурсы, которые создаются на стороне сервера, которые я бы хотел очистить, когда клиент отключается. Я просмотрел документы, но я не могу найти способ обнаружить, когда это произойдет. Есть идеи?Обнаруживать, когда клиент закрывает соединение с обработчиком запросов aiohttp

ответ

3

Это не очень очевидно, глядя на документы, но ключ здесь заключается в том, что асинхронный сервер будет бросать CancelledError в обработчик обработчика при закрытии соединения. Вы можете поймать CancelledError везде, где вы ожидаете завершения асинхронной операции.

Используя это, я очистить после связи с чем-то вроде этого:

async def passthrough_data_until_disconnect(): 
    await create_resources() 
    while True: 
     try: 
      await get_next_data_item() 
     except (concurrent.futures.CancelledError, 
       aiohttp.ClientDisconnectedError): 
      # The request has been cancelled, due to a disconnect 
      await do_cleanup() 
      # Re-raise the cancellation error so the handler 
      # task gets cancelled for real 
      raise 
     else: 
      await write_data_to_client_response() 
+4

Вы должны поймать как '' asyncio.CancelledError' и aiohttp.ClientDisconnectedError' –

+0

О, я не знал о том, что один ; Я уточню свой ответ. Благодаря! –

+0

Где я могу это использовать? Я в значительной степени не понимаю. – Goodies

 Смежные вопросы

  • Нет связанных вопросов^_^