|
|
|
|
@ -15,6 +15,10 @@ from app.database import (
|
|
|
|
|
from app.services.task_service import TaskService
|
|
|
|
|
from app.services.image_service import ImageService
|
|
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
import glob
|
|
|
|
|
from config.algorithm_config import AlgorithmConfig
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
task_bp = Blueprint('task', __name__)
|
|
|
|
|
|
|
|
|
|
@ -65,6 +69,33 @@ def get_task_status(task_id, current_user_id):
|
|
|
|
|
return jsonify(status), 200
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@task_bp.route('/<int:task_id>/logs', methods=['GET'])
|
|
|
|
|
@int_jwt_required
|
|
|
|
|
def get_task_logs(task_id, current_user_id):
|
|
|
|
|
"""获取任务日志"""
|
|
|
|
|
task = Task.query.get(task_id)
|
|
|
|
|
if not TaskService.ensure_task_owner(task, current_user_id):
|
|
|
|
|
return TaskService.json_error('任务不存在或无权限', 404)
|
|
|
|
|
|
|
|
|
|
log_dir = AlgorithmConfig.LOGS_DIR
|
|
|
|
|
# 匹配模式:*task_{task_id}_*.log
|
|
|
|
|
pattern = os.path.join(log_dir, f'*task_{task_id}_*.log')
|
|
|
|
|
log_files = glob.glob(pattern)
|
|
|
|
|
|
|
|
|
|
if not log_files:
|
|
|
|
|
return jsonify({'logs': '暂无日志'}), 200
|
|
|
|
|
|
|
|
|
|
# 如果有多个,取修改时间最新的一个
|
|
|
|
|
latest_log = max(log_files, key=os.path.getmtime)
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
with open(latest_log, 'r', encoding='utf-8') as f:
|
|
|
|
|
content = f.read()
|
|
|
|
|
return jsonify({'logs': content}), 200
|
|
|
|
|
except Exception as e:
|
|
|
|
|
return TaskService.json_error(f'读取日志失败: {str(e)}', 500)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@task_bp.route('/<int:task_id>/cancel', methods=['POST'])
|
|
|
|
|
@int_jwt_required
|
|
|
|
|
def cancel_task(task_id, current_user_id):
|
|
|
|
|
|