2026-04-29-22-49-38 - 修复WebSocket连接+项目状态异常+导入按钮无响应+后端WS路由
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
import logging
|
||||
from contextlib import asynccontextmanager
|
||||
|
||||
from fastapi import FastAPI
|
||||
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
|
||||
from config import settings
|
||||
@@ -81,3 +81,59 @@ app.include_router(export.router)
|
||||
def health_check() -> dict:
|
||||
"""Health check endpoint."""
|
||||
return {"status": "ok", "service": "SegServer"}
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# WebSocket: 实时进度推送
|
||||
# ---------------------------------------------------------------------------
|
||||
class ConnectionManager:
|
||||
"""Manage WebSocket connections for progress broadcasting."""
|
||||
|
||||
def __init__(self):
|
||||
self.active_connections: list[WebSocket] = []
|
||||
|
||||
async def connect(self, websocket: WebSocket):
|
||||
await websocket.accept()
|
||||
self.active_connections.append(websocket)
|
||||
logger.info("WebSocket client connected. Total: %d", len(self.active_connections))
|
||||
|
||||
def disconnect(self, websocket: WebSocket):
|
||||
if websocket in self.active_connections:
|
||||
self.active_connections.remove(websocket)
|
||||
logger.info("WebSocket client disconnected. Total: %d", len(self.active_connections))
|
||||
|
||||
async def broadcast(self, message: dict):
|
||||
"""Broadcast a message to all connected clients."""
|
||||
for connection in self.active_connections.copy():
|
||||
try:
|
||||
await connection.send_json(message)
|
||||
except Exception as exc:
|
||||
logger.warning("WebSocket send failed: %s", exc)
|
||||
self.disconnect(connection)
|
||||
|
||||
|
||||
manager = ConnectionManager()
|
||||
|
||||
|
||||
@app.websocket("/ws/progress")
|
||||
async def websocket_progress(websocket: WebSocket):
|
||||
"""WebSocket endpoint for real-time parsing/AI progress updates."""
|
||||
await manager.connect(websocket)
|
||||
try:
|
||||
while True:
|
||||
# Receive client messages (heartbeat / subscription requests)
|
||||
data = await websocket.receive_text()
|
||||
logger.debug("WebSocket received: %s", data)
|
||||
|
||||
# Echo heartbeat to keep connection alive
|
||||
await websocket.send_json({
|
||||
"type": "status",
|
||||
"status": "connected",
|
||||
"message": "Progress stream active",
|
||||
"timestamp": str(logging.time.time() if hasattr(logging, 'time') else __import__('time').time()),
|
||||
})
|
||||
except WebSocketDisconnect:
|
||||
manager.disconnect(websocket)
|
||||
except Exception as exc:
|
||||
logger.error("WebSocket error: %s", exc)
|
||||
manager.disconnect(websocket)
|
||||
|
||||
Reference in New Issue
Block a user