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)
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue