From 8f9a4ea72d86b4b46ba8dbe04928ebb160eebf9a Mon Sep 17 00:00:00 2001 From: glpshchn <464976@niuitmo.ru> Date: Mon, 15 Dec 2025 07:14:28 +0300 Subject: [PATCH] Update files --- moderation/backend-py/websocket_server.py | 39 +++++++++++++++-------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/moderation/backend-py/websocket_server.py b/moderation/backend-py/websocket_server.py index f63cda8..dbdb63d 100644 --- a/moderation/backend-py/websocket_server.py +++ b/moderation/backend-py/websocket_server.py @@ -38,19 +38,23 @@ def broadcast_online(): sio.emit('online', online_list, namespace='/mod-chat') -# Обработчик для корневого namespace (требуется для Socket.IO handshake) -# В python-socketio для корневого namespace нужно использовать @sio.on('connect') без namespace -@sio.on('connect') -async def on_connect_root(sid, environ): - """Handle client connection to root namespace (Socket.IO handshake)""" - print(f"[WebSocket] 🔄 Handshake to ROOT namespace: {sid}") - print(f"[WebSocket] Environ type: {type(environ)}") - if environ: - print(f"[WebSocket] Environ keys: {list(environ.keys()) if isinstance(environ, dict) else 'N/A'}") - logger.info(f"[WebSocket] Handshake to ROOT namespace: {sid}") - # Разрешаем подключение для handshake - # Возвращаем True, чтобы разрешить подключение - return True +# Создаем класс для корневого namespace +class RootNamespace(socketio.AsyncNamespace): + """Root namespace handler for Socket.IO handshake""" + async def on_connect(self, sid, environ): + """Handle client connection to root namespace (Socket.IO handshake)""" + print(f"[WebSocket] 🔄 Handshake to ROOT namespace: {sid}") + print(f"[WebSocket] Environ type: {type(environ)}") + if environ: + print(f"[WebSocket] Environ keys: {list(environ.keys()) if isinstance(environ, dict) else 'N/A'}") + logger.info(f"[WebSocket] Handshake to ROOT namespace: {sid}") + # Разрешаем подключение для handshake + return True + +# Регистрируем корневой namespace ПЕРЕД созданием ASGI app +root_ns = RootNamespace('/') +sio.register_namespace(root_ns) +print(f"[WebSocket] ✅ Корневой namespace зарегистрирован: {root_ns.namespace}") # Namespace handlers for /mod-chat @sio.on('connect', namespace='/mod-chat') @@ -174,13 +178,20 @@ def get_socketio_app(): try: # Проверяем зарегистрированные namespaces if hasattr(sio, 'namespace_handlers'): - print(f"[WebSocket] Зарегистрированные namespaces: {list(sio.namespace_handlers.keys())}") + namespaces = list(sio.namespace_handlers.keys()) + print(f"[WebSocket] Зарегистрированные namespaces: {namespaces}") + if not namespaces: + print("[WebSocket] ⚠️ ВНИМАНИЕ: Нет зарегистрированных namespaces!") elif hasattr(sio, 'handlers'): print(f"[WebSocket] Зарегистрированные handlers: {list(sio.handlers.keys())}") else: print("[WebSocket] Не удалось определить зарегистрированные namespaces") + # Попробуем проверить через другие атрибуты + print(f"[WebSocket] Доступные атрибуты sio: {[attr for attr in dir(sio) if not attr.startswith('_')]}") except Exception as e: print(f"[WebSocket] Ошибка при проверке namespaces: {e}") + import traceback + traceback.print_exc() # Socket.IO ASGI app должен обернуть FastAPI app для правильной работы # Но мы делаем это в main.py через SocketIOWrapper