fix(websocket): 修复 app.py 不可导入并新增真实链路验证
- 将 /api/sessions/{sid}/ws 端点移入 create_app(此前置于模块级导致整模块 import NameError,回归被验证拦截)
- register_loop + subscribe 调整至 accept 之前,缩小连接已开但未订阅期间的进度丢失窗口
- 新增 tests/test_verify_ws_real_flow.py:驱动真实 HTTP 聊天流程断言 WS 收到 agent 实际发射的 parse/impact 进度
- 同步 WebSocket 计划文档 Task 3 代码片段(标注端点必须位于 create_app 内)
- 全量 pytest 实测 583 passed / 99.03% 达标
This commit is contained in:
@@ -299,19 +299,22 @@ Expected: FAIL(404 / 路由不存在)
|
||||
在 `create_app` 内新增端点:
|
||||
|
||||
```python
|
||||
@app.websocket("/api/sessions/{sid}/ws")
|
||||
async def session_progress_ws(ws: WebSocket, sid: str):
|
||||
await ws.accept()
|
||||
hub.register_loop(asyncio.get_running_loop())
|
||||
q = hub.subscribe(sid)
|
||||
try:
|
||||
while True:
|
||||
event = await q.get()
|
||||
await ws.send_json(event)
|
||||
except WebSocketDisconnect:
|
||||
pass
|
||||
finally:
|
||||
hub.unsubscribe(sid, q)
|
||||
# 注意:端点必须定义在 create_app 函数体内(缩进),因为 app 是局部变量;
|
||||
# 若误置于模块级,@app.websocket 引用未定义的 app 会导致整模块 import 即 NameError。
|
||||
@app.websocket("/api/sessions/{sid}/ws")
|
||||
async def session_progress_ws(ws: WebSocket, sid: str):
|
||||
# 先注册循环并订阅,再 accept,缩小「连接已开但尚未订阅」期间的进度丢失窗口
|
||||
hub.register_loop(asyncio.get_running_loop())
|
||||
q = hub.subscribe(sid)
|
||||
await ws.accept()
|
||||
try:
|
||||
while True:
|
||||
event = await q.get()
|
||||
await ws.send_json(event)
|
||||
except WebSocketDisconnect:
|
||||
pass
|
||||
finally:
|
||||
hub.unsubscribe(sid, q)
|
||||
```
|
||||
|
||||
(`asyncio` 已在 app.py 导入;若未导入则补 `import asyncio`。)
|
||||
|
||||
Reference in New Issue
Block a user