175 lines
5.9 KiB
Python
175 lines
5.9 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""
|
||
@Time : 2025/8/15 19:29
|
||
@Auth : 九月的海
|
||
@File : views.py
|
||
@IDE : PyCharm
|
||
@Motto : Catch as catch can....
|
||
"""
|
||
from chuangliangBaidu.migrations.BaidutaskQuery import AsyncTaskDataQuery
|
||
from chuangliangProject.magic_cat.task_client_magic import MagicTaskQuery
|
||
from django.http import JsonResponse
|
||
from django.views.decorators.http import require_GET
|
||
from django.views.decorators.http import require_http_methods
|
||
from django.utils import timezone
|
||
from django.shortcuts import render
|
||
import json
|
||
import logging
|
||
|
||
logger = logging.getLogger('chuangliang')
|
||
|
||
|
||
def get_task_details(request):
|
||
"""获取任务详情的API接口(优化版)"""
|
||
# 获取任务ID参数
|
||
task_id = request.GET.get('task_id')
|
||
current_time = timezone.now().strftime("%Y-%m-%d %H:%M:%S")
|
||
|
||
# 处理浏览器请求的Accept头
|
||
is_browser_request = 'text/html' in request.META.get('HTTP_ACCEPT', '')
|
||
|
||
# 参数验证
|
||
if not task_id:
|
||
error_data = {
|
||
"code": 400,
|
||
"message": "缺少参数: task_id",
|
||
"time": current_time,
|
||
"endpoint": request.path,
|
||
"method": request.method
|
||
}
|
||
if is_browser_request:
|
||
logger.error(error_data)
|
||
return render(request, 'json_formatter3.html', {
|
||
"json_data": json.dumps(error_data, ensure_ascii=False),
|
||
"status": 400
|
||
})
|
||
logger.error(error_data)
|
||
return JsonResponse(error_data, status=400, json_dumps_params={'ensure_ascii': False})
|
||
|
||
try:
|
||
# 转换为整数
|
||
task_id = int(task_id)
|
||
except ValueError:
|
||
error_data = {
|
||
"code": 400,
|
||
"message": "task_id 必须是整数",
|
||
"time": current_time,
|
||
"provided_value": task_id
|
||
}
|
||
if is_browser_request:
|
||
logger.error(error_data)
|
||
return render(request, 'json_formatter3.html', {
|
||
"json_data": json.dumps(error_data, ensure_ascii=False),
|
||
"status": 400
|
||
})
|
||
logger.error(error_data)
|
||
return JsonResponse(error_data, status=400, json_dumps_params={'ensure_ascii': False})
|
||
|
||
# 创建查询实例并获取数据
|
||
try:
|
||
logger.info(f'查询的任务ID: {task_id}')
|
||
task_query = AsyncTaskDataQuery(task_id)
|
||
result = task_query.get_task_details()
|
||
# 处理任务日志并解码中文
|
||
task_logs = result.get("task_logs", [])
|
||
for log in task_logs:
|
||
# 处理 task_param
|
||
if isinstance(log.get('task_param'), str):
|
||
try:
|
||
log['task_param'] = json.loads(log['task_param'])
|
||
except json.JSONDecodeError:
|
||
pass
|
||
# 处理 result_data
|
||
if isinstance(log.get('result_data'), str):
|
||
try:
|
||
log['result_data'] = json.loads(log['result_data'])
|
||
except json.JSONDecodeError:
|
||
pass
|
||
|
||
# 准备响应数据
|
||
response_data = {
|
||
"code": 200,
|
||
"message": "查询成功",
|
||
"check_time": current_time,
|
||
"task_id": task_id,
|
||
"batch_id": result.get("batch_id", ""),
|
||
"total_logs": len(task_logs),
|
||
"task_logs": task_logs,
|
||
"create_status": result.get("create_status", "")
|
||
}
|
||
|
||
# 如果是浏览器请求,返回HTML视图
|
||
if is_browser_request:
|
||
logger.info(json.dumps(response_data))
|
||
return render(request, 'json_formatter3.html', {
|
||
# "json_data": response_data,
|
||
"json_data": json.dumps(response_data, ensure_ascii=False, indent=2),
|
||
"status": 200,
|
||
"task_id": task_id
|
||
})
|
||
|
||
logger.info(response_data)
|
||
return JsonResponse(
|
||
response_data,
|
||
json_dumps_params={'ensure_ascii': False}
|
||
)
|
||
|
||
except Exception as e:
|
||
error_data = {
|
||
"code": 500,
|
||
"message": "服务器内部错误",
|
||
"error": str(e),
|
||
"time": current_time,
|
||
"task_id": task_id
|
||
}
|
||
if is_browser_request:
|
||
logger.error(error_data)
|
||
return render(request, 'json_formatter3.html', {
|
||
"json_data": json.dumps(error_data, ensure_ascii=False),
|
||
"status": 500
|
||
})
|
||
logger.error(error_data)
|
||
return JsonResponse(error_data, status=500, json_dumps_params={'ensure_ascii': False})
|
||
|
||
|
||
# @csrf_exempt # 如果不需要CSRF保护,可以添加此装饰器
|
||
@require_http_methods(["GET"]) # 限制只允许GET请求
|
||
def get_magic_task_info(request):
|
||
"""
|
||
获取魔剪任务信息的GET接口
|
||
接收参数:task - 任务ID
|
||
"""
|
||
task_id = request.GET.get('taskid')
|
||
# 验证参数
|
||
if not task_id:
|
||
return JsonResponse({
|
||
'status': 'error',
|
||
'message': '缺少必要参数: task'
|
||
}, status=400, json_dumps_params={'ensure_ascii': False})
|
||
|
||
try:
|
||
# 将参数转换为整数
|
||
task_id = int(task_id)
|
||
except ValueError:
|
||
return JsonResponse({
|
||
'status': 'error',
|
||
'message': '参数格式错误: task必须是整数'
|
||
}, status=400, json_dumps_params={'ensure_ascii': False})
|
||
|
||
try:
|
||
# 创建查询实例并获取任务信息
|
||
task_query = MagicTaskQuery(task_id)
|
||
result = task_query.get_task_info()
|
||
|
||
# 返回成功响应
|
||
return JsonResponse(result, status=200, json_dumps_params={'ensure_ascii': False})
|
||
|
||
except Exception as e:
|
||
# 记录错误日志(实际项目中应该使用日志模块)
|
||
print(f"查询魔剪任务信息失败: {str(e)}")
|
||
|
||
# 返回错误响应
|
||
return JsonResponse({
|
||
'status': 'error',
|
||
'message': f'查询失败: {str(e)}'
|
||
}, status=500, json_dumps_params={'ensure_ascii': False}) |