12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- import json
- import asyncio
- import tornado
- import tornado.websocket
- from ..session import AsyncBasedSession, ThreadBasedWebIOSession, get_session_implement
- def webio_handler(task_func, debug=True):
- class WSHandler(tornado.websocket.WebSocketHandler):
- def check_origin(self, origin):
- return True
- def get_compression_options(self):
- # Non-None enables compression with default options.
- return {}
- def send_msg_to_client(self, controller: AsyncBasedSession):
- for msg in controller.get_task_messages():
- self.write_message(json.dumps(msg))
- def open(self):
- print("WebSocket opened")
- self.set_nodelay(True)
- self._close_from_session = False # 是否从session中关闭连接
- if get_session_implement() is AsyncBasedSession:
- self.controller = AsyncBasedSession(task_func, on_task_message=self.send_msg_to_client,
- on_session_close=self.close)
- else:
- self.controller = ThreadBasedWebIOSession(task_func, on_task_message=self.send_msg_to_client,
- on_session_close=self.close_from_session,
- loop=asyncio.get_event_loop())
- print('open return, ThreadBasedWebIOSession.thread2session', ThreadBasedWebIOSession.thread2session)
- def on_message(self, message):
- # print('on_message', message)
- data = json.loads(message)
- self.controller.send_client_event(data)
- def close_from_session(self):
- self._close_from_session = True
- self.close()
- def on_close(self):
- if not self._close_from_session:
- self.controller.close(no_session_close_callback=True)
- print("WebSocket closed")
- return WSHandler
|