from fastapi import APIRouter, HTTPException, Request, WebSocket from fastapi.responses import HTMLResponse from fastapi.templating import Jinja2Templates from models.task import TaskForm, TaskManager router = APIRouter() task_manager = TaskManager() # 创建新任务 @router.post("", summary="创建新任务") def create_task(form: TaskForm): task = task_manager.add_task(name=form.name, user_id=123456, description=form.description) return task # 获取任务列表 @router.get("", summary="获取任务列表", description="可使用user_id参数筛选指定用户的任务列表") def get_task_list(user_id: int=None): return task_manager.get_tasks(user_id) # websocket demo @router.get("/demo", response_class=HTMLResponse) async def websocket_demo(request: Request): task_list = task_manager.get_tasks() templates = Jinja2Templates(directory="templates") return templates.TemplateResponse("websocket.html", {"request": request, "task_list": task_list}) # 监听指定任务的变化事件, 通知前端(不使用pydantic模型, 正确的写法) @router.websocket("/{task_id}", name="监听任务变化") async def websocket_endpoint(task_id: str, websocket: WebSocket): await websocket.accept() await task_manager.add_websocket(task_id, websocket) async for data in websocket.iter_text(): await websocket.send_text(f"Message text was: {data}") task_manager.remove_websocket(task_id, websocket) print("websocket 连接已自动关闭") #await websocket.send_json({"message": "Hello WebSocket!"}) #task = task_manager.get_task(task_id) #print(task) #if not task: # print("task 不存在, 结束连接") # return await websocket.close() # 任务不存在, 结束连接 #await websocket.send_json(task) # 将任务的状态发送给客户端 #await task_manager.add_websocket(task_id, websocket) # 正确的写法, 使用 async for, 并且处理意外断开的情况 #try: # async for data in websocket.iter_text(): # if data == "close": # print("客户端主动关闭连接") # task_manager.remove_websocket(task_id, websocket) # await websocket.close() # break # else: # print(f"接收到客户端消息: {data}") # await websocket.send_text(f"Message text was: {data}") #except Exception as e: # print(f"客户端意外断开连接: {e}") # task_manager.remove_websocket(task_id, websocket) # #await websocket.close() # 监听客户端的状态, 如果客户端主动关闭连接或意外断开连接, 都从任务的websocket列表中移除 #while True: # try: # data = await websocket.receive_text() # if data == "close": # print("客户端主动关闭连接") # task_manager.remove_websocket(task_id, websocket) # await websocket.close() # break # else: # print(f"接收到客户端消息: {data}") # await websocket.send_text(f"Message text was: {data}") # except Exception as e: # print(f"客户端意外断开连接: {e}") # task_manager.remove_websocket(task_id, websocket) # #await websocket.close() # break # 获取任务详情 @router.get("/{task_id}", summary="获取任务详情") def get_task(task_id: int): return get_task(task_id) # 删除任务 @router.delete("/{task_id}", summary="删除指定任务") def delete_task(task_id: int): return delete_task(task_id)