executions.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. # backend/app/api/executions.py
  2. from fastapi import APIRouter, Depends, HTTPException, status
  3. from sqlalchemy.orm import Session
  4. from typing import Optional
  5. from datetime import datetime
  6. from ..database import get_db
  7. from ..models import TaskExecutionLog, Spider
  8. from ..schemas import TaskExecutionLog as TaskExecutionLogSchema, ListResponse, SuccessResponse
  9. # 修复:确保变量名是 router
  10. router = APIRouter(prefix="/api/executions", tags=["executions"])
  11. @router.post("/spiders/{spider_id}/run")
  12. def run_spider(spider_id: int, db: Session = Depends(get_db)):
  13. spider = db.query(Spider).filter(Spider.id == spider_id).first()
  14. if not spider:
  15. raise HTTPException(
  16. status_code=status.HTTP_404_NOT_FOUND,
  17. detail="脚本不存在"
  18. )
  19. # 创建执行记录
  20. execution_log = TaskExecutionLog(
  21. spider_id=spider_id,
  22. status="RUNNING",
  23. trigger_method="MANUAL",
  24. started_at=datetime.now()
  25. )
  26. db.add(execution_log)
  27. db.commit()
  28. db.refresh(execution_log)
  29. # TODO: 调用Celery任务
  30. # run_spider_task.delay(spider_id, "MANUAL")
  31. return SuccessResponse(
  32. success=True,
  33. message=f"脚本 {spider.name} 开始执行,执行ID: {execution_log.id}"
  34. )
  35. @router.get("/spiders/{spider_id}", response_model=ListResponse)
  36. def get_spider_executions(spider_id: int, limit: Optional[int] = None, db: Session = Depends(get_db)):
  37. # 验证spider存在
  38. spider = db.query(Spider).filter(Spider.id == spider_id).first()
  39. if not spider:
  40. raise HTTPException(
  41. status_code=status.HTTP_404_NOT_FOUND,
  42. detail="脚本不存在"
  43. )
  44. query = db.query(TaskExecutionLog).filter(TaskExecutionLog.spider_id == spider_id)
  45. if limit:
  46. query = query.limit(limit)
  47. executions = query.order_by(TaskExecutionLog.started_at.desc()).all()
  48. # 加载spider信息
  49. for execution in executions:
  50. execution.spider
  51. return ListResponse(total=len(executions), items=executions)
  52. @router.get("/{execution_id}", response_model=TaskExecutionLogSchema)
  53. def get_execution_log(execution_id: int, db: Session = Depends(get_db)):
  54. execution = db.query(TaskExecutionLog).filter(TaskExecutionLog.id == execution_id).first()
  55. if not execution:
  56. raise HTTPException(
  57. status_code=status.HTTP_404_NOT_FOUND,
  58. detail="执行记录不存在"
  59. )
  60. execution.spider
  61. return execution