import os import uuid import threading from flask import Flask, request, jsonify from oss2 import Auth, Bucket from A1_GenerateMarkdown import * from A2_MarkdownToPptx import * from A3_MarkdownToDocx import * app = Flask(__name__) # 内存存储任务状态 tasks = {} # OSS配置 OSS_ACCESS_KEY = 'LTAI5t5jxkgJtRK8wew8fnbq' OSS_SECRET_KEY = 'b8HXNGz7IkI3Dhv7BZx9BNBEZy1uku' OSS_ENDPOINT = 'oss-cn-hangzhou.aliyuncs.com' OSS_BUCKET_NAME = 'ylt' # 或者更明确的写法(推荐) OSS_PREFIX = f'https://{OSS_BUCKET_NAME}.{OSS_ENDPOINT.replace("https://", "")}' # 初始化OSS客户端 oss_auth = Auth(OSS_ACCESS_KEY, OSS_SECRET_KEY) oss_bucket = Bucket(oss_auth, OSS_ENDPOINT, OSS_BUCKET_NAME) def async_generate_task(guid, course_name): """异步生成任务""" try: tasks[guid] = {'status': 'processing', 'files': {}} # 生成Markdown md_path = mdWorkingPath / f"{guid}.md" generate_document(course_name, md_path) # 生成PPTX pptx_path = Path(f"/tmp/{guid}.pptx") generate("通用", str(pptx_path), str(md_path)) pptx_url = upload_to_oss(pptx_path, f"HuangHai/pptx/{guid}.pptx") tasks[guid]['files']['pptx'] = pptx_url # 生成DOCX docx_path = Path(f"/tmp/{guid}.docx") convert_md_to_docx( input_md=str(md_path), output_docx=str(docx_path), reference_template=Path(__file__).parent / "left-aligned-template.docx" ) docx_url = upload_to_oss(docx_path, f"docx/{guid}.docx") tasks[guid]['files']['docx'] = docx_url # 清理临时文件 os.remove(md_path) os.remove(pptx_path) os.remove(docx_path) tasks[guid]['status'] = 'completed' except Exception as e: tasks[guid]['status'] = 'failed' tasks[guid]['error'] = str(e) def upload_to_oss(local_path, object_name): """上传文件到OSS""" # 添加路径格式校验 if object_name.startswith('/'): object_name = object_name[1:] oss_bucket.put_object_from_file(object_name, str(local_path)) return f"{OSS_PREFIX}/{object_name}" @app.route('/submit', methods=['POST']) def submit_task(): """提交生成任务接口""" course_name = request.json.get('course_name') if not course_name: return jsonify({'code': 400, 'msg': '课程名称不能为空'}), 400 guid = str(uuid.uuid4()) tasks[guid] = {'status': 'pending'} # 初始状态 # 启动异步任务 thread = threading.Thread( target=async_generate_task, args=(guid, course_name) ) thread.start() return jsonify({ 'code': 0, 'msg': '任务已提交', 'task_id': guid }) @app.route('/check/') def check_task(guid): """查询任务状态接口""" task = tasks.get(guid) if not task: return jsonify({'code': 404, 'msg': '任务不存在'}), 404 if task['status'] == 'completed': return jsonify({ 'code': 0, 'status': 'completed', 'files': task['files'] }) elif task['status'] == 'failed': return jsonify({ 'code': 500, 'status': 'failed', 'error': task.get('error', '未知错误') }) else: return jsonify({ 'code': 0, 'status': 'processing', 'msg': '生成进行中,请稍后查询' }) if __name__ == '__main__': app.run(host='0.0.0.0', port=6000, threaded=True) ''' curl -X POST http://10.10.21.20:6000/submit -H "Content-Type: application/json" -d '{"course_name": "小学数学三角形内角和"}' '''