95 lines
3.6 KiB
Python
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)
|