122 lines
5.3 KiB
Python
122 lines
5.3 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
综合测试所有修复
|
||
"""
|
||
import urllib.request
|
||
import json
|
||
|
||
def test_fixes_comprehensive():
|
||
try:
|
||
print("=== 综合测试API修复 ===")
|
||
|
||
# 1. 测试模型列表
|
||
print("\n1. 测试模型列表:")
|
||
url = 'http://localhost:5000/api/models'
|
||
with urllib.request.urlopen(url) as response:
|
||
data = response.read().decode('utf-8')
|
||
result = json.loads(data)
|
||
|
||
models = result.get('data', [])
|
||
print(f"模型数量: {len(models)}")
|
||
|
||
if models:
|
||
print("可用模型:")
|
||
for model in models:
|
||
model_type = model.get('model_type', '')
|
||
product_id = model.get('product_id', '')
|
||
model_id = model.get('model_id', '')
|
||
print(f" - {model_type}/{product_id} (ID: {model_id})")
|
||
|
||
# 2. 测试模型详情端点
|
||
print("\n2. 测试模型详情端点:")
|
||
|
||
if models:
|
||
# 测试第一个模型的详情
|
||
first_model = models[0]
|
||
model_type = first_model.get('model_type', '')
|
||
product_id = first_model.get('product_id', '')
|
||
|
||
details_url = f'http://localhost:5000/api/models/{model_type}/{product_id}/details'
|
||
print(f"请求: {details_url}")
|
||
|
||
try:
|
||
req = urllib.request.Request(details_url)
|
||
# 添加一些常见的请求头来测试CORS
|
||
req.add_header('Origin', 'http://localhost:5173')
|
||
req.add_header('Content-Type', 'application/json')
|
||
|
||
with urllib.request.urlopen(req) as response:
|
||
print(f"状态码: {response.status}")
|
||
|
||
# 检查CORS头
|
||
headers = dict(response.headers)
|
||
cors_headers = {k: v for k, v in headers.items() if 'access-control' in k.lower()}
|
||
if cors_headers:
|
||
print("CORS头:")
|
||
for k, v in cors_headers.items():
|
||
print(f" {k}: {v}")
|
||
|
||
details_data = response.read().decode('utf-8')
|
||
details_result = json.loads(details_data)
|
||
|
||
if details_result.get('status') == 'success':
|
||
print("详情API: SUCCESS")
|
||
data_obj = details_result.get('data', {})
|
||
model_info = data_obj.get('model_info', {})
|
||
training_metrics = data_obj.get('training_metrics', {})
|
||
|
||
print(f"模型信息字段: {len(model_info)}")
|
||
print(f"训练指标: {list(training_metrics.keys())}")
|
||
|
||
if training_metrics:
|
||
print("主要指标:")
|
||
for metric in ['RMSE', 'MAE', 'R2', 'MAPE']:
|
||
if metric in training_metrics:
|
||
print(f" {metric}: {training_metrics[metric]}")
|
||
else:
|
||
print(f"详情API错误: {details_result.get('message', '未知')}")
|
||
|
||
except urllib.error.HTTPError as e:
|
||
print(f"HTTP错误: {e.code}")
|
||
try:
|
||
error_data = e.read().decode('utf-8')
|
||
error_result = json.loads(error_data)
|
||
print(f"错误详情: {error_result.get('error', '无详情')}")
|
||
except:
|
||
print("无法解析错误响应")
|
||
except Exception as e:
|
||
print(f"请求异常: {e}")
|
||
|
||
# 3. 测试CORS预检请求
|
||
print("\n3. 测试CORS预检请求:")
|
||
try:
|
||
req = urllib.request.Request('http://localhost:5000/api/models', method='OPTIONS')
|
||
req.add_header('Origin', 'http://localhost:5173')
|
||
req.add_header('Access-Control-Request-Method', 'GET')
|
||
req.add_header('Access-Control-Request-Headers', 'Content-Type')
|
||
|
||
with urllib.request.urlopen(req) as response:
|
||
print(f"OPTIONS请求状态: {response.status}")
|
||
cors_headers = {k: v for k, v in dict(response.headers).items() if 'access-control' in k.lower()}
|
||
if cors_headers:
|
||
print("CORS预检响应头:")
|
||
for k, v in cors_headers.items():
|
||
print(f" {k}: {v}")
|
||
except Exception as e:
|
||
print(f"OPTIONS请求失败: {e}")
|
||
|
||
print(f"\n=== 修复状态总结 ===")
|
||
print("1. 模型详情端点: 修复文件名格式匹配问题")
|
||
print("2. CORS配置: 增强跨域头设置")
|
||
print("3. 预检请求: 添加OPTIONS方法处理")
|
||
print("4. 安全头: 添加Cross-Origin策略头")
|
||
print("\n如果前端仍有CORS错误,请检查:")
|
||
print("- 前端是否运行在http://localhost:5173")
|
||
print("- API是否运行在http://localhost:5000")
|
||
print("- 浏览器开发者工具Network面板的详细错误")
|
||
|
||
except Exception as e:
|
||
print(f"测试失败: {e}")
|
||
|
||
if __name__ == "__main__":
|
||
test_fixes_comprehensive() |