diff --git a/flask_app/routes/get_deviation.py b/flask_app/routes/get_deviation.py index 9c2ff19..e84a5ec 100644 --- a/flask_app/routes/get_deviation.py +++ b/flask_app/routes/get_deviation.py @@ -1,12 +1,10 @@ # flask_app/routes/get_deviation.py from flask import Blueprint, jsonify, Response, g -import json import os from flask_app.general.format_change import download_file -from flask_app.routes.upload import create_response, sse_format from flask_app.routes.偏离表main import get_tech_and_business_deviation -from flask_app.routes.utils import generate_deviation_response, validate_and_setup_logger +from flask_app.routes.utils import generate_deviation_response, validate_and_setup_logger,create_response,sse_format from flask_app.ConnectionLimiter import require_connection_limit get_deviation_bp = Blueprint('get_deviation', __name__) @@ -29,7 +27,7 @@ def get_deviation(): status='error', data='' ) - yield sse_format(**response) + yield sse_format(response) return # 终止生成器 # 直接下载并处理文件 filename = "ztbfile" @@ -43,7 +41,7 @@ def get_deviation(): status='error', data='' ) - yield sse_format(**response) + yield sse_format(response) return # 终止生成器 logger.info("Local file path: " + downloaded_filepath) @@ -54,12 +52,13 @@ def get_deviation(): ) if deviations is None: + logger.info(f"上传的文件非招标文件或文件内容不完整!") response = create_response( message='上传的文件非招标文件或文件内容不完整!', status='error', data='' ) - yield sse_format(**response) + yield sse_format(response) return # 终止生成器 # 解包返回值 @@ -80,13 +79,13 @@ def get_deviation(): } # 流式返回数据 - yield sse_format(**tech_deviation_response) - yield sse_format(**tech_deviation_star_response) - yield sse_format(**zigefuhe_deviation_response) - yield sse_format(**shangwu_deviation_response) - yield sse_format(**shangwu_star_deviation_response) - yield sse_format(**proof_materials_response) - yield sse_format(**final_response) + yield sse_format(tech_deviation_response) + yield sse_format(tech_deviation_star_response) + yield sse_format(zigefuhe_deviation_response) + yield sse_format(shangwu_deviation_response) + yield sse_format(shangwu_star_deviation_response) + yield sse_format(proof_materials_response) + yield sse_format(final_response) except Exception as e: logger.error('发生异常: ' + str(e)) @@ -95,7 +94,7 @@ def get_deviation(): status='error', data='' ) - yield sse_format(**response) + yield sse_format(response) return Response(generate(), mimetype='text/event-stream') diff --git a/flask_app/routes/little_zbparse.py b/flask_app/routes/little_zbparse.py index 489396f..aedc837 100644 --- a/flask_app/routes/little_zbparse.py +++ b/flask_app/routes/little_zbparse.py @@ -48,6 +48,7 @@ def little_zbparse(): final_json_path = download_and_process_file(file_url, zb_type) if not final_json_path: + logger.info(f"上传的文件非招标文件或文件内容不完整!") return create_response( message='上传的文件非招标文件或文件内容不完整!', status='error', diff --git a/flask_app/routes/upload.py b/flask_app/routes/upload.py index f7cec40..6ff01aa 100644 --- a/flask_app/routes/upload.py +++ b/flask_app/routes/upload.py @@ -3,43 +3,13 @@ from flask import Blueprint, request, jsonify,g import json import os import time - from flask_app.general.format_change import download_file from flask_app.routes.工程标解析main import engineering_bid_main from flask_app.routes.货物标解析main import goods_bid_main from flask_app.general.post_processing import outer_post_processing -from flask_app.routes.utils import generate_deviation_response, validate_and_setup_logger +from flask_app.routes.utils import generate_deviation_response, validate_and_setup_logger,create_response,sse_format from flask_app.ConnectionLimiter import require_connection_limit - -def create_response(message, status, data): - """ - 创建一个统一格式的响应字典。 - - :param message: 响应消息 - :param status: 响应状态(如 'success', 'error', 'processing') - :param data: 具体的数据内容 - :return: 字典格式的响应 - """ - return { - 'message': message, - 'status': status, - 'data': data - } - - -def sse_format(message, status, data): - """ - 将响应格式化为 Server-Sent Events (SSE) 的格式。 - - :param message: 响应消息 - :param status: 响应状态(如 'success', 'error', 'processing') - :param data: 具体的数据内容 - :return: 格式化后的 SSE 字符串 - """ - response = create_response(message, status, data) - return f"data: {json.dumps(response, ensure_ascii=False)}\n\n" - upload_bp = Blueprint('upload', __name__) @upload_bp.route('/upload', methods=['POST']) @validate_and_setup_logger @@ -91,7 +61,7 @@ def process_and_stream(file_url, zb_type): status='error', data='' ) - yield sse_format(**error_response) + yield sse_format(error_response) return downloaded_filepath, file_type = downloaded @@ -103,7 +73,7 @@ def process_and_stream(file_url, zb_type): status='error', data='' ) - yield sse_format(**error_response) + yield sse_format(error_response) return logger.info("本地文件路径: " + downloaded_filepath) @@ -131,13 +101,13 @@ def process_and_stream(file_url, zb_type): if 'error' in parsed_data: # 适当处理错误 - logger.error(f"处理错误: {parsed_data['error']}") + logger.error("上传的文件非招标文件或文件内容不完整!") response = create_response( message='上传的文件非招标文件或文件内容不完整!', status='error', data='' ) - yield sse_format(**response) + yield sse_format(response) return # 直接返回,终止生成器 if 'good_list' in parsed_data: @@ -154,7 +124,7 @@ def process_and_stream(file_url, zb_type): status='success', data=data ) - yield sse_format(**response) + yield sse_format(response) base_end_time = time.time() logger.info(f"分段解析完成,耗时:{base_end_time - start_time:.2f} 秒") @@ -170,12 +140,12 @@ def process_and_stream(file_url, zb_type): proof_materials, logger) # 使用通用响应函数 - yield sse_format(**tech_deviation_response) - yield sse_format(**tech_deviation_star_response) - yield sse_format(**zigefuhe_deviation_response) - yield sse_format(**shangwu_deviation_response) - yield sse_format(**shangwu_star_deviation_response) - yield sse_format(**proof_materials_response) + yield sse_format(tech_deviation_response) + yield sse_format(tech_deviation_star_response) + yield sse_format(zigefuhe_deviation_response) + yield sse_format(shangwu_deviation_response) + yield sse_format(shangwu_star_deviation_response) + yield sse_format(proof_materials_response) try: with open(extracted_info_path, 'w', encoding='utf-8') as json_file: @@ -196,21 +166,21 @@ def process_and_stream(file_url, zb_type): status='success', data=json.dumps(extracted_info, ensure_ascii=False) ) - yield sse_format(**extracted_info_response) + yield sse_format(extracted_info_response) complete_response = create_response( message='Combined_data', status='success', data=json.dumps(final_result, ensure_ascii=False) ) - yield sse_format(**complete_response) + yield sse_format(complete_response) final_response = create_response( message='文件上传并处理成功', status='success', data='END' ) - yield sse_format(**final_response) + yield sse_format(final_response) finally: end_time = time.time() diff --git a/flask_app/routes/utils.py b/flask_app/routes/utils.py index 9f8a2b9..3a5148f 100644 --- a/flask_app/routes/utils.py +++ b/flask_app/routes/utils.py @@ -142,4 +142,26 @@ def perform_cleanup(output_folder, logger): else: logger.info("清理完毕!") except Exception as e: - logger.error(f"清理过程中发生异常: {str(e)}") \ No newline at end of file + logger.error(f"清理过程中发生异常: {str(e)}") + +def create_response(message, status, data): + """ + 创建一个统一格式的响应字典。 + + :param message: 响应消息 + :param status: 响应状态(如 'success', 'error', 'processing') + :param data: 具体的数据内容 + :return: 字典格式的响应 + """ + return { + 'message': message, + 'status': status, + 'data': data + } + + +def sse_format(response): + """ + 将响应格式化为 Server-Sent Events (SSE) 的格式。 + """ + return f"data: {json.dumps(response, ensure_ascii=False)}\n\n" \ No newline at end of file