refactor: 优化后端 WebSocket 路由
- 优化 api/routers/websocket.py Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -9,6 +9,7 @@ from enum import Enum
|
|||||||
from typing import Dict
|
from typing import Dict
|
||||||
|
|
||||||
from fastapi import WebSocket, WebSocketDisconnect, HTTPException
|
from fastapi import WebSocket, WebSocketDisconnect, HTTPException
|
||||||
|
from starlette.websockets import WebSocketState
|
||||||
from sqlalchemy import select
|
from sqlalchemy import select
|
||||||
from sqlalchemy.ext.asyncio import AsyncSession
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
|
|
||||||
@@ -163,6 +164,9 @@ async def websocket_endpoint(
|
|||||||
# 主循环:处理消息
|
# 主循环:处理消息
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
|
if websocket.application_state != WebSocketState.CONNECTED:
|
||||||
|
logger.info(f"WebSocket 已非连接状态,退出循环: conversation_id={conversation_id}")
|
||||||
|
break
|
||||||
message = await websocket.receive_json()
|
message = await websocket.receive_json()
|
||||||
msg_type = message.get("type")
|
msg_type = message.get("type")
|
||||||
|
|
||||||
@@ -326,10 +330,14 @@ async def websocket_endpoint(
|
|||||||
break
|
break
|
||||||
|
|
||||||
except RuntimeError as e:
|
except RuntimeError as e:
|
||||||
# 检查是否是断开连接相关的错误
|
# 检查是否是断开连接或未连接状态(如 accept 前/后连接被关闭)
|
||||||
error_msg = str(e)
|
error_msg = str(e)
|
||||||
if "disconnect" in error_msg.lower() or "Cannot call \"receive\"" in error_msg:
|
if (
|
||||||
logger.info(f"WebSocket 连接已断开: conversation_id={conversation_id}")
|
"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
|
break
|
||||||
else:
|
else:
|
||||||
logger.error(f"处理消息时发生 RuntimeError: {e}", exc_info=True)
|
logger.error(f"处理消息时发生 RuntimeError: {e}", exc_info=True)
|
||||||
|
|||||||
Reference in New Issue
Block a user