| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- # backend/app/api/executions.py
- from fastapi import APIRouter, Depends, HTTPException, status
- from sqlalchemy.orm import Session
- from typing import Optional
- from datetime import datetime
- from ..database import get_db
- from ..models import TaskExecutionLog, Spider
- from ..schemas import TaskExecutionLog as TaskExecutionLogSchema, ListResponse, SuccessResponse
- # 修复:确保变量名是 router
- router = APIRouter(prefix="/api/executions", tags=["executions"])
- @router.post("/spiders/{spider_id}/run")
- def run_spider(spider_id: int, db: Session = Depends(get_db)):
- spider = db.query(Spider).filter(Spider.id == spider_id).first()
- if not spider:
- raise HTTPException(
- status_code=status.HTTP_404_NOT_FOUND,
- detail="脚本不存在"
- )
-
- # 创建执行记录
- execution_log = TaskExecutionLog(
- spider_id=spider_id,
- status="RUNNING",
- trigger_method="MANUAL",
- started_at=datetime.now()
- )
- db.add(execution_log)
- db.commit()
- db.refresh(execution_log)
-
- # TODO: 调用Celery任务
- # run_spider_task.delay(spider_id, "MANUAL")
-
- return SuccessResponse(
- success=True,
- message=f"脚本 {spider.name} 开始执行,执行ID: {execution_log.id}"
- )
- @router.get("/spiders/{spider_id}", response_model=ListResponse)
- def get_spider_executions(spider_id: int, limit: Optional[int] = None, db: Session = Depends(get_db)):
- # 验证spider存在
- spider = db.query(Spider).filter(Spider.id == spider_id).first()
- if not spider:
- raise HTTPException(
- status_code=status.HTTP_404_NOT_FOUND,
- detail="脚本不存在"
- )
-
- query = db.query(TaskExecutionLog).filter(TaskExecutionLog.spider_id == spider_id)
-
- if limit:
- query = query.limit(limit)
-
- executions = query.order_by(TaskExecutionLog.started_at.desc()).all()
-
- # 加载spider信息
- for execution in executions:
- execution.spider
-
- return ListResponse(total=len(executions), items=executions)
- @router.get("/{execution_id}", response_model=TaskExecutionLogSchema)
- def get_execution_log(execution_id: int, db: Session = Depends(get_db)):
- execution = db.query(TaskExecutionLog).filter(TaskExecutionLog.id == execution_id).first()
- if not execution:
- raise HTTPException(
- status_code=status.HTTP_404_NOT_FOUND,
- detail="执行记录不存在"
- )
-
- execution.spider
- return execution
|