From b3c02e1a88f6137fb3cf3bb53cf9f4a9a8783019 Mon Sep 17 00:00:00 2001 From: iammm0 Date: Fri, 13 Feb 2026 10:56:45 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=20WebSocket=20=E8=B7=AF=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 优化 api/routers/websocket.py Co-authored-by: Cursor --- api/routers/websocket.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/api/routers/websocket.py b/api/routers/websocket.py index 33d1593..27b9a78 100644 --- a/api/routers/websocket.py +++ b/api/routers/websocket.py @@ -9,6 +9,7 @@ from enum import Enum from typing import Dict from fastapi import WebSocket, WebSocketDisconnect, HTTPException +from starlette.websockets import WebSocketState from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession @@ -163,6 +164,9 @@ async def websocket_endpoint( # 主循环:处理消息 while True: try: + if websocket.application_state != WebSocketState.CONNECTED: + logger.info(f"WebSocket 已非连接状态,退出循环: conversation_id={conversation_id}") + break message = await websocket.receive_json() msg_type = message.get("type") @@ -326,10 +330,14 @@ async def websocket_endpoint( break except RuntimeError as e: - # 检查是否是断开连接相关的错误 + # 检查是否是断开连接或未连接状态(如 accept 前/后连接被关闭) error_msg = str(e) - if "disconnect" in error_msg.lower() or "Cannot call \"receive\"" in error_msg: - logger.info(f"WebSocket 连接已断开: conversation_id={conversation_id}") + if ( + "disconnect" in error_msg.lower() + or "Cannot call \"receive\"" in error_msg + or "accept" in error_msg.lower() and "not connected" in error_msg.lower() + ): + logger.info(f"WebSocket 连接已断开或未就绪: conversation_id={conversation_id}, error={error_msg}") break else: logger.error(f"处理消息时发生 RuntimeError: {e}", exc_info=True)