Files
reverse_image_search_gpu/routers/task.py
2024-11-04 05:20:42 +08:00

95 lines
3.6 KiB
Python

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)