8 changed files with 963 additions and 609 deletions
@ -1,206 +1,286 @@ |
|||||
from flask import Flask, request, jsonify, Response |
# from flask import Flask, request, jsonify, Response |
||||
import os |
import os |
||||
from checkPlaceName import checkPlaceName |
from checkPlaceName import checkPlaceName |
||||
from checkRepeatText import checkRepeatText |
from checkRepeatText import checkRepeatText |
||||
from checkCompanyName import checkCompanyName |
from checkCompanyName import checkCompanyName |
||||
from checkDocumentError import checkDocumentError |
from checkDocumentError import checkDocumentError |
||||
from checkTitleName import checkTitleName |
from checkTitleName import checkTitleName |
||||
from flask_cors import CORS |
# from flask_cors import CORS |
||||
import qwen_agenttext |
import qwen_agenttext |
||||
from myLogger import outLog |
from myLogger import outLog |
||||
import time |
import time |
||||
app = Flask(__name__) |
# app = Flask(__name__) |
||||
cros = CORS(app) |
# cros = CORS(app) |
||||
|
import uvicorn |
||||
|
from fastapi import FastAPI, Request, File, UploadFile, HTTPException |
||||
|
from fastapi.responses import JSONResponse |
||||
|
from fastapi.middleware.cors import CORSMiddleware |
||||
|
from sse_starlette.sse import EventSourceResponse |
||||
|
import asyncio |
||||
|
|
||||
|
app = FastAPI() |
||||
|
# 允许所有来源的跨域请求 |
||||
|
app.add_middleware( |
||||
|
CORSMiddleware, |
||||
|
allow_origins=["*"], |
||||
|
allow_credentials=True, |
||||
|
allow_methods=["*"], |
||||
|
allow_headers=["*"] |
||||
|
) |
||||
|
|
||||
UPLOAD_FOLDER = 'uploads' |
UPLOAD_FOLDER = 'uploads' |
||||
if not os.path.exists(UPLOAD_FOLDER): |
if not os.path.exists(UPLOAD_FOLDER): |
||||
os.makedirs(UPLOAD_FOLDER) |
os.makedirs(UPLOAD_FOLDER) |
||||
|
|
||||
|
|
||||
@app.route('/upload', methods=['POST']) |
# @app.route('/upload', methods=['POST']) |
||||
def upload_file(): |
# def upload_file(): |
||||
if 'file' not in request.files: |
# if 'file' not in request.files: |
||||
return jsonify({"error": "No file part"}), 400 |
# return jsonify({"error": "No file part"}), 400 |
||||
file = request.files['file'] |
# file = request.files['file'] |
||||
if file.filename == '': |
# if file.filename == '': |
||||
return jsonify({"error": "No selected file"}), 400 |
# return jsonify({"error": "No selected file"}), 400 |
||||
if file: |
# if file: |
||||
filename = file.filename |
# filename = file.filename |
||||
file.save(os.path.join(UPLOAD_FOLDER, filename)) |
# file.save(os.path.join(UPLOAD_FOLDER, filename)) |
||||
return jsonify({"message": "File uploaded successfully"}), 200 |
# return jsonify({"message": "File uploaded successfully"}), 200 |
||||
|
@app.post("/sse/upload") |
||||
|
async def upload_file(file: UploadFile = File(...)): |
||||
@app.route('/stream', methods=["GET", "POST"]) |
if not file.filename: |
||||
def stream_numbers(): |
raise HTTPException(status_code=400, detail="No selected file") |
||||
context = request.args.get('context') |
|
||||
# def generate_numbers(): |
# 保存文件 |
||||
# event_id=0 |
try: |
||||
# for number in range(1, 10): |
file_location = os.path.join(UPLOAD_FOLDER, file.filename) |
||||
# json_data = json.dumps({"number": number}) |
with open(file_location, "wb") as f: |
||||
# print(json_data) |
content = await file.read() |
||||
# event_id += 1 |
f.write(content) |
||||
# yield f"id: {event_id}\n" |
return JSONResponse(content={"message": "文件上传成功"}, status_code=200) |
||||
# yield f"event: time-update\n" |
except Exception as e: |
||||
# yield f"data: {json_data}\n\n" # 每次生成一个数字就发送 |
raise HTTPException(status_code=500, detail="文件上传失败,错误信息:" + str(e)) |
||||
# time.sleep(0.5) # 为了演示,加入短暂延迟 |
|
||||
# json_data = json.dumps({"number": "done"}) |
|
||||
# yield f"id: {1}\n" |
@app.get("/sse") |
||||
# yield f"event: time-update\n" |
async def root(request: Request): |
||||
# yield f"data: {json_data}\n\n" # 发送完成信号 |
async def event_generator(request: Request): |
||||
|
res_str = "七夕情人节即将来临,我们为您准备了精美的鲜花和美味的蛋糕" |
||||
headers = { |
for i in res_str: |
||||
"Content-Type": "text/event-stream", |
if await request.is_disconnected(): |
||||
"Cache-Control": "no-cache", |
print("连接已中断") |
||||
"X-Accel-Buffering": "no", |
break |
||||
"Access-Control-Allow-Origin": "*", |
yield { |
||||
"Access-Control-Allow-Methods": "GET,POST", |
"event": "message", |
||||
"Access-Control-Allow-Headers": "x-requested-with,content-type", |
"id": "7", |
||||
} |
"data": f"{i}" |
||||
return Response(qwen_agenttext.getxinx(context), headers=headers) |
} |
||||
|
|
||||
|
await asyncio.sleep(0.1) |
||||
@app.route('/sse/checkRepeatText', methods=['GET']) |
|
||||
def checkRepeatTextWeb(): |
g = event_generator(request) |
||||
filename = request.args.get('filename') |
return EventSourceResponse(g) |
||||
userId = request.args.get("userId") |
|
||||
|
|
||||
def generate_checkRepeatText(filename,userId): |
# def stream_numbers(): |
||||
|
# context = request.args.get('context') |
||||
|
# # def generate_numbers(): |
||||
|
# # event_id=0 |
||||
|
# # for number in range(1, 10): |
||||
|
# # json_data = json.dumps({"number": number}) |
||||
|
# # print(json_data) |
||||
|
# # event_id += 1 |
||||
|
# # yield f"id: {event_id}\n" |
||||
|
# # yield f"event: time-update\n" |
||||
|
# # yield f"data: {json_data}\n\n" # 每次生成一个数字就发送 |
||||
|
# # time.sleep(0.5) # 为了演示,加入短暂延迟 |
||||
|
# # json_data = json.dumps({"number": "done"}) |
||||
|
# # yield f"id: {1}\n" |
||||
|
# # yield f"event: time-update\n" |
||||
|
# # yield f"data: {json_data}\n\n" # 发送完成信号 |
||||
|
|
||||
|
# headers = { |
||||
|
# "Content-Type": "text/event-stream", |
||||
|
# "Cache-Control": "no-cache", |
||||
|
# "X-Accel-Buffering": "no", |
||||
|
# "Access-Control-Allow-Origin": "*", |
||||
|
# "Access-Control-Allow-Methods": "GET,POST", |
||||
|
# "Access-Control-Allow-Headers": "x-requested-with,content-type", |
||||
|
# } |
||||
|
# return Response(qwen_agenttext.getxinx(context), headers=headers) |
||||
|
|
||||
|
@app.get("/sse/checkRepeatText") |
||||
|
async def checkRepeatTextWeb(filename, userId, request: Request): |
||||
|
async def generate_checkRepeatText(filename, userId, request: Request): |
||||
|
global outLog |
||||
id = 0 |
id = 0 |
||||
for i in checkRepeatText(filename,userId): |
for i in checkRepeatText(filename, userId, outLog): |
||||
yield f"id: {id + 1}\n" |
id += 1 |
||||
yield f"event: checkRepeatText\n" |
if await request.is_disconnected(): |
||||
yield f"data: {i}\n\n" # 发送完成信号 |
yield { |
||||
# except Exception as e: |
"id": f"{id}", |
||||
|
"event": "checkRepeatText", |
||||
# yield f"id: {id+1}\n" |
"data": "checkRepeatText连接已中断" |
||||
# yield f"event: checkRepeatText\n" |
} |
||||
# yield f"data: **程序出现异常**\n\n" # 发送完成信号 |
break |
||||
|
yield { |
||||
headers = { |
"id": f"{id}", |
||||
"Content-Type": "text/event-stream", |
"event": "checkRepeatText", |
||||
"Cache-Control": "no-cache", |
"data": i |
||||
"X-Accel-Buffering": "no", |
} |
||||
"Access-Control-Allow-Origin": "*", |
|
||||
"Access-Control-Allow-Methods": "GET,POST", |
g = generate_checkRepeatText(filename, userId, request) |
||||
"Access-Control-Allow-Headers": "x-requested-with,content-type", |
return EventSourceResponse(g) |
||||
} |
|
||||
return Response(generate_checkRepeatText(filename,userId), headers=headers) |
|
||||
|
@app.get('/sse/checkPlaceName') |
||||
|
def checkPlaceNameWebSse(filename, userId, request: Request): |
||||
@app.route('/sse/checkPlaceName', methods=['GET']) |
async def generate_checkPlaceName(filename, userId, request: Request): |
||||
def checkPlaceNameWebSse(): |
|
||||
filename = request.args.get('filename') |
|
||||
userId = request.args.get("userId") |
|
||||
def generate_checkPlaceName(filename,userId): |
|
||||
id = 0 |
id = 0 |
||||
for i in checkPlaceName(filename,userId): |
global outLog |
||||
yield f"id: {id + 1}\n" |
for i in checkPlaceName(filename, userId, outLog): |
||||
yield f"event: checkPlaceName\n" |
id += 1 |
||||
yield f"data: {i}\n\n" # 发送完成信号 |
if await request.is_disconnected(): |
||||
|
yield { |
||||
headers = { |
"id": f"{id}", |
||||
"Content-Type": "text/event-stream", |
"event": "checkPlaceName", |
||||
"Cache-Control": "no-cache", |
"data": "checkPlaceName连接已中断" |
||||
"X-Accel-Buffering": "no", |
} |
||||
"Access-Control-Allow-Origin": "*", |
break |
||||
"Access-Control-Allow-Methods": "GET,POST", |
yield { |
||||
"Access-Control-Allow-Headers": "x-requested-with,content-type", |
"id": f"{id}", |
||||
} |
"event": "checkPlaceName", |
||||
return Response(generate_checkPlaceName(filename,userId), headers=headers) |
"data": i |
||||
|
} |
||||
|
|
||||
@app.route('/sse/checkCompanyName', methods=['GET']) |
g = generate_checkPlaceName(filename, userId, request) |
||||
def checkCompanyNameWebSse(): |
return EventSourceResponse(g) |
||||
filename = request.args.get('filename') |
|
||||
userId = request.args.get("userId") |
|
||||
def generate_checkCompanyName(filename,userId): |
@app.get('/sse/checkCompanyName') |
||||
|
def checkCompanyNameWebSse(filename, userId, request: Request): |
||||
|
async def generate_checkCompanyName(filename, userId, request: Request): |
||||
id = 0 |
id = 0 |
||||
for i in checkCompanyName(filename,userId): |
global outLog |
||||
yield f"id: {id + 1}\n" |
for i in checkCompanyName(filename, userId, outLog): |
||||
yield f"event: checkCompanyName\n" |
id += 1 |
||||
yield f"data: {i}\n\n" # 发送完成信号 |
if await request.is_disconnected(): |
||||
|
yield { |
||||
headers = { |
"id": f"{id}", |
||||
"Content-Type": "text/event-stream", |
"event": "checkCompanyName", |
||||
"Cache-Control": "no-cache", |
"data": "checkCompanyName连接已中断" |
||||
"X-Accel-Buffering": "no", |
} |
||||
"Access-Control-Allow-Origin": "*", |
break |
||||
"Access-Control-Allow-Methods": "GET,POST", |
yield { |
||||
"Access-Control-Allow-Headers": "x-requested-with,content-type", |
"id": f"{id}", |
||||
} |
"event": "checkCompanyName", |
||||
return Response(generate_checkCompanyName(filename,userId), headers=headers) |
"data": i |
||||
|
} |
||||
|
|
||||
@app.route('/sse/checkDocumentErrorWeb', methods=['GET']) |
g = generate_checkCompanyName(filename, userId, request) |
||||
def checkDocumentErrorWebSse(): |
return EventSourceResponse(g) |
||||
filename = request.args.get('filename') |
|
||||
userId = request.args.get("userId") |
|
||||
def generate_checkDocumentError(filename,userId): |
@app.get('/sse/checkDocumentErrorWeb') |
||||
|
def checkDocumentErrorWebSse(filename, userId, request: Request): |
||||
|
async def generate_checkDocumentError(filename, userId, request: Request): |
||||
id = 0 |
id = 0 |
||||
for i in checkDocumentError(filename,userId): |
global outLog |
||||
yield f"id: {id + 1}\n" |
for i in checkDocumentError(filename, userId, outLog): |
||||
yield f"event: checkDocumentError\n" |
id += 1 |
||||
yield f"data: {i}\n\n" # 发送完成信号 |
if await request.is_disconnected(): |
||||
|
yield { |
||||
headers = { |
"id": f"{id}", |
||||
"Content-Type": "text/event-stream", |
"event": "checkDocumentError", |
||||
"Cache-Control": "no-cache", |
"data": "checkDocumentError连接已中断" |
||||
"X-Accel-Buffering": "no", |
} |
||||
"Access-Control-Allow-Origin": "*", |
break |
||||
"Access-Control-Allow-Methods": "GET,POST", |
yield { |
||||
"Access-Control-Allow-Headers": "x-requested-with,content-type", |
"id": f"{id}", |
||||
} |
"event": "checkDocumentError", |
||||
return Response(generate_checkDocumentError(filename,userId), headers=headers) |
"data": i |
||||
|
} |
||||
|
|
||||
@app.route('/sse/checkTitleName', methods=['GET']) |
g = generate_checkDocumentError(filename, userId, request) |
||||
def checkTitleNameWebSse(): |
return EventSourceResponse(g) |
||||
filename = request.args.get('filename') |
|
||||
userId = request.args.get("userId") |
|
||||
def generate_checkTitleName(filename,userId): |
@app.get('/sse/checkTitleName') |
||||
|
def checkTitleNameWebSse(filename, userId, request: Request): |
||||
|
async def generate_checkTitleName(filename, userId, request: Request): |
||||
id = 0 |
id = 0 |
||||
for i in checkTitleName(filename,userId): |
global outLog |
||||
yield f"id: {id + 1}\n" |
for i in checkTitleName(filename, userId, outLog): |
||||
yield f"event: checkTitleName\n" |
id += 1 |
||||
yield f"data: {i}\n\n" # 发送完成信号 |
if await request.is_disconnected(): |
||||
|
yield { |
||||
headers = { |
"id": f"{id}", |
||||
"Content-Type": "text/event-stream", |
"event": "checkTitleName", |
||||
"Cache-Control": "no-cache", |
"data": "checkTitleName连接已中断" |
||||
"X-Accel-Buffering": "no", |
} |
||||
"Access-Control-Allow-Origin": "*", |
break |
||||
"Access-Control-Allow-Methods": "GET,POST", |
yield { |
||||
"Access-Control-Allow-Headers": "x-requested-with,content-type", |
"id": f"{id}", |
||||
} |
"event": "checkTitleName", |
||||
return Response(generate_checkTitleName(filename,userId), headers=headers) |
"data": i |
||||
|
} |
||||
@app.route('/sse/getLog', methods=['GET']) |
|
||||
def getlog(): |
g = generate_checkTitleName(filename, userId, request) |
||||
userId = request.args.get("userId") |
return EventSourceResponse(g) |
||||
def generate_getLog(userId): |
|
||||
time.sleep(1) |
|
||||
|
@app.get("/sse/getLog") |
||||
|
# @app.route('/sse/getLog', methods=['GET']) |
||||
|
async def getlog(userId, request: Request): |
||||
|
# userId = request.args.get("userId") |
||||
|
async def generate_getLog(userId): |
||||
id = 0 |
id = 0 |
||||
|
global outLog |
||||
|
await asyncio.sleep(5) |
||||
while True: |
while True: |
||||
if outLog.is_done(userId): |
isbreak = outLog.is_done(userId) |
||||
|
if isbreak: |
||||
|
break # 完成了 |
||||
|
text = outLog.get_queueData(userId) |
||||
|
if await request.is_disconnected(): |
||||
|
yield { |
||||
|
"id": f"{id}", |
||||
|
"event": "checkTitleName", |
||||
|
"data": "checkTitleName连接已中断" |
||||
|
} |
||||
break |
break |
||||
q = outLog.get_queueData(userId) |
if text: |
||||
if q: |
id += 1 |
||||
id+=1 |
yield { |
||||
text = q.pop(0) |
"id": id, |
||||
yield f"id: {id}\n" |
"event": "getlog", |
||||
yield f"event: getlog\n" |
"data": text |
||||
yield f"data: {text}\n\n" # 发送完成信号 |
} |
||||
yield f"id: {id}\n" |
# yield f"id: {id}\n" |
||||
yield f"event: getlog\n" |
# yield f"event: getlog\n" |
||||
yield f"data: 任务结束!!!!!\n\n" # 发送完成信号 |
# yield f"data: {text}\n\n" # 发送完成信号 |
||||
|
# yield f"id: {id}\n" |
||||
|
# yield f"event: getlog\n" |
||||
|
# yield f"data: 任务结束!!!!!\n\n" # 发送完成信号 |
||||
|
yield { |
||||
|
"id": id, |
||||
|
"event": "getlog", |
||||
|
"data": "任务结束!!!!" |
||||
|
} |
||||
outLog.del_queue(userId) |
outLog.del_queue(userId) |
||||
headers = { |
|
||||
"Content-Type": "text/event-stream", |
# headers = { |
||||
"Cache-Control": "no-cache", |
# "Content-Type": "text/event-stream", |
||||
"X-Accel-Buffering": "no", |
# "Cache-Control": "no-cache", |
||||
"Access-Control-Allow-Origin": "*", |
# "X-Accel-Buffering": "no", |
||||
"Access-Control-Allow-Methods": "GET,POST", |
# "Access-Control-Allow-Origin": "*", |
||||
"Access-Control-Allow-Headers": "x-requested-with,content-type", |
# "Access-Control-Allow-Methods": "GET,POST", |
||||
} |
# "Access-Control-Allow-Headers": "x-requested-with,content-type", |
||||
return Response(generate_getLog(userId), headers=headers) |
# } |
||||
|
g = generate_getLog(userId) |
||||
|
return EventSourceResponse(g) |
||||
|
# return Response(generate_getLog(userId), headers=headers) |
||||
|
|
||||
|
|
||||
if __name__ == '__main__': |
if __name__ == '__main__': |
||||
app.run(host="0.0.0.0", port=80) |
# app.run(host="0.0.0.0", port=80,threaded=True) |
||||
|
# uvicorn.run(app='main:app', host="0.0.0.0", port=80,workers=1) |
||||
|
app.run() |
||||
|
Loading…
Reference in new issue