121 lines
4.1 KiB
Python
121 lines
4.1 KiB
Python
from flask import Flask, request, jsonify, render_template
|
||
import subprocess
|
||
import sys
|
||
from datetime import datetime
|
||
import os
|
||
import json
|
||
# 在server.py顶部添加
|
||
import pandas as pd
|
||
import logging
|
||
from logging.handlers import RotatingFileHandler
|
||
import time
|
||
|
||
app = Flask(__name__)
|
||
|
||
# 在Flask应用初始化后添加
|
||
@app.before_first_request
|
||
def load_batch_data():
|
||
# 读取批文Excel文件
|
||
batch_path = r'C:\Users\24011\Documents\WeChat Files\wxid_k4ep58f81rx421\FileStorage\File\2025-04\tuigua_huangjijingshi - 副本\tuigua_huangjijingshi - 副本\python1\批文.xlsx'
|
||
app.batch_data = pd.read_excel(batch_path)
|
||
|
||
# 在 Flask 应用初始化后添加日志配置
|
||
def setup_logging():
|
||
# 创建日志目录(如果不存在)
|
||
log_dir = os.path.join(os.path.dirname(__file__), 'logs')
|
||
os.makedirs(log_dir, exist_ok=True)
|
||
|
||
# 配置根日志
|
||
logging.basicConfig(
|
||
level=logging.INFO,
|
||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
||
handlers=[
|
||
RotatingFileHandler(
|
||
os.path.join(log_dir, 'app.log'),
|
||
maxBytes=1024*1024*5, # 5MB
|
||
backupCount=5
|
||
),
|
||
logging.StreamHandler()
|
||
]
|
||
)
|
||
|
||
# 在应用初始化后调用
|
||
setup_logging()
|
||
logger = logging.getLogger(__name__)
|
||
@app.route('/')
|
||
def home():
|
||
return render_template('index.html')
|
||
|
||
@app.route('/calculate', methods=['POST'])
|
||
def calculate():
|
||
start_time = time.time()
|
||
logger.info("开始处理计算请求")
|
||
|
||
date_str = request.form.get('date')
|
||
time_str = request.form.get('time', '00:00:00')
|
||
|
||
try:
|
||
# 验证日期和时间格式
|
||
datetime.strptime(date_str, '%Y-%m-%d')
|
||
datetime.strptime(time_str, '%H:%M:%S')
|
||
datetime_str = f"{date_str} {time_str}"
|
||
|
||
api_path = os.path.join(os.path.dirname(__file__), 'API.py')
|
||
logger.info(f"准备调用API.py,参数: {datetime_str}")
|
||
|
||
api_start = time.time()
|
||
result = subprocess.run(
|
||
[sys.executable, api_path, datetime_str],
|
||
capture_output=True,
|
||
text=True,
|
||
check=True
|
||
)
|
||
api_time = time.time() - api_start
|
||
logger.info(f"API.py执行完成,耗时: {api_time:.2f}秒")
|
||
|
||
logger.debug("=== API.py 原始输出 ===")
|
||
logger.debug(f"stdout: {result.stdout[:200]}...") # 只记录前200字符
|
||
logger.debug(f"stderr: {result.stderr[:200]}...")
|
||
|
||
try:
|
||
json_start = time.time()
|
||
json_output = json.loads(result.stdout)
|
||
json_time = time.time() - json_start
|
||
logger.info(f"JSON解析完成,耗时: {json_time:.2f}秒")
|
||
|
||
total_time = time.time() - start_time
|
||
logger.info(f"请求处理完成,总耗时: {total_time:.2f}秒")
|
||
return jsonify({'success': True, 'result': json_output})
|
||
|
||
except json.JSONDecodeError as e:
|
||
error_msg = f'JSON解析失败: {str(e)}'
|
||
logger.error(error_msg)
|
||
logger.error(f"原始输出: {result.stdout[:500]}")
|
||
return jsonify({
|
||
'success': False,
|
||
'error': error_msg,
|
||
'raw_output': result.stdout[:500]
|
||
})
|
||
|
||
except ValueError as e:
|
||
error_msg = f'无效的日期格式: {str(e)}'
|
||
logger.error(error_msg)
|
||
return jsonify({'success': False, 'error': error_msg})
|
||
|
||
except subprocess.CalledProcessError as e:
|
||
error_msg = f'计算失败: {e.stderr}'
|
||
logger.error(error_msg)
|
||
logger.error(f"stdout: {e.stdout[:500]}")
|
||
return jsonify({
|
||
'success': False,
|
||
'error': error_msg,
|
||
'stdout': e.stdout[:500]
|
||
})
|
||
|
||
except Exception as e:
|
||
error_msg = f'服务器错误: {str(e)}'
|
||
logger.error(error_msg, exc_info=True)
|
||
return jsonify({'success': False, 'error': error_msg})
|
||
|
||
if __name__ == '__main__':
|
||
app.run(debug=True,host='0.0.0.0',port=5000) |