main
黄海 5 months ago
parent a2544bdce1
commit 4642d304f9

@ -0,0 +1,124 @@
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/<guid>')
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=5000, threaded=True)
Loading…
Cancel
Save