#!/usr/bin/env python3 # 检查服务器路由并修复问题 import os import json from flask import Flask, send_from_directory, jsonify, send_file # 设置应用 app = Flask(__name__) app.config['OUTPUT_FOLDER'] = '/app/output' app.config['UPLOAD_FOLDER'] = '/app/uploads' @app.route('/view_report/') def view_report(task_id): """提供报告预览页面""" try: task_output_dir = os.path.join(app.config['OUTPUT_FOLDER'], task_id) html_path = os.path.join(task_output_dir, "summary.html") if os.path.exists(html_path): print(f"提供报告预览: {html_path}") return send_file(html_path) else: # 查找是否有备用报告文件 backup_files = [f for f in os.listdir(task_output_dir) if f.endswith('.html')] if backup_files: alt_html_path = os.path.join(task_output_dir, backup_files[0]) print(f"提供备用报告预览: {alt_html_path}") return send_file(alt_html_path) else: return "找不到报告文件", 404 except Exception as e: print(f"提供报告预览时出错: {str(e)}") return f"服务器错误: {str(e)}", 500 @app.route('/results//') def get_result_file(job_id, filename): """提供访问结果文件的路由""" try: file_path = os.path.join(app.config['OUTPUT_FOLDER'], job_id, filename) if os.path.exists(file_path): return send_file(file_path) else: return f"文件不存在: {file_path}", 404 except Exception as e: return f"访问文件出错: {str(e)}", 500 @app.route('/api/tasks') def api_get_tasks(): """获取所有任务列表""" tasks = [] try: # 遍历输出目录中的所有作业 for job_id in os.listdir(app.config['OUTPUT_FOLDER']): job_dir = os.path.join(app.config['OUTPUT_FOLDER'], job_id) if os.path.isdir(job_dir): # 尝试读取结果文件 results_file = os.path.join(job_dir, "results.json") # 默认任务信息 task = { "id": job_id, "status": "completed", "progress": 100, "result_path": f"/view_report/{job_id}", "filename": f"视频_{job_id[:6]}", "uploaded_at": "2024-05-01 12:00:00", "size": 0, "message": "处理完成" } # 尝试从原始视频文件获取信息 try: # 检查是否有同名的视频文件 for filename in os.listdir(app.config['UPLOAD_FOLDER']): if job_id in filename: task["filename"] = filename break except Exception: pass # 尝试从结果文件获取更多信息 if os.path.exists(results_file): try: with open(results_file, 'r') as f: results = json.load(f) # 填充任务信息 if "video_info" in results and "filename" in results["video_info"]: task["filename"] = results["video_info"]["filename"] if "analysis" in results and "timestamp" in results["analysis"]: task["uploaded_at"] = results["analysis"]["timestamp"] except Exception as e: print(f"解析结果文件出错: {str(e)}") # 如果没有摘要文件,检查目录中是否有HTML文件 summary_path = os.path.join(job_dir, "summary.html") if not os.path.exists(summary_path): html_files = [f for f in os.listdir(job_dir) if f.endswith('.html')] if html_files: # 使用第一个HTML文件作为摘要 task["result_path"] = f"/results/{job_id}/{html_files[0]}" tasks.append(task) except Exception as e: print(f"获取任务列表出错: {str(e)}") return jsonify({"tasks": tasks}) # 打印路由表 def print_routes(): print("\n当前应用路由表:") for rule in app.url_map.iter_rules(): print(f"{rule.endpoint}: {rule.rule}") if __name__ == "__main__": print_routes() app.run(debug=True, host='0.0.0.0', port=5000)