WebSocket Handler on_close метод асинхронной реализации торнадо - PullRequest
3 голосов
/ 19 апреля 2019

Я работаю над созданием веб-приложения с использованием торнадо версии 6.0.2. Я использую обработчик WebSocket для настройки соединения с клиентом.

Пример реализации на стороне сервера:

from tornado import websocket
import connectionhandler


class WebSocketHandler(websocket.WebSocketHandler):
    def initialize(self, connectionhandler):
        self.connectionhandler = connectionhandler

    async def open(self):
        print("WebSocket opened.")
        await self.connectionhandler.connection_established_websocket()

    async def on_close(self):
        print("WebSocket closed.")
        await self.connectionhandler.connection_closed_websocket()

Пример реализации на стороне клиента:

ws = websocket.create_connection("ws://localhost:80/ws?")
ws.close()

Когда клиент устанавливает соединение, он вызывает метод open, и все работает правильно.

Но когда клиент закрывает соединение, я получаю сообщение об ошибке on_close, которая никогда не ожидалась.

При удалении родной сопрограммы метод on_close работает.

Вопрос:

Как добавить собственные сопрограммы для метода on_close или вызвать асинхронный метод из on_close ()?

1 Ответ

0 голосов
/ 19 апреля 2019

on_close не является асинхронной функцией.Чтобы запустить асинхронную функцию из on_close, используйте IOLoop.add_callback.

from tornado.ioloop import IOLoop


def on_close(self):
     IOLoop.current().add_callback(
        self.connectionhandler.connection_closed_websocket
     )
...