115 lines
4.3 KiB
Python
115 lines
4.3 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
立即测试CORS配置 - 模拟浏览器请求
|
||
"""
|
||
|
||
import requests
|
||
import json
|
||
|
||
def immediate_cors_test():
|
||
"""立即测试CORS,模拟浏览器行为"""
|
||
|
||
api_base = "http://127.0.0.1:5000"
|
||
|
||
print("🔥 立即CORS测试 - 模拟浏览器请求")
|
||
print("=" * 50)
|
||
|
||
# 模拟浏览器的标准头部
|
||
browser_headers = {
|
||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
|
||
'Accept': 'application/json, text/plain, */*',
|
||
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
|
||
'Origin': 'http://localhost:5173',
|
||
'Referer': 'http://localhost:5173/',
|
||
'Content-Type': 'application/json'
|
||
}
|
||
|
||
# 测试序列
|
||
tests = [
|
||
("/api/health", "GET", "基础健康检查"),
|
||
("/api/stores", "GET", "店铺列表"),
|
||
("/api/products", "GET", "产品列表"),
|
||
("/api/training", "GET", "训练任务列表")
|
||
]
|
||
|
||
for endpoint, method, description in tests:
|
||
print(f"\n🧪 测试: {description}")
|
||
print(f"📍 {method} {endpoint}")
|
||
|
||
try:
|
||
# 1. 先发送OPTIONS预检请求(浏览器会自动发送)
|
||
print(" 1️⃣ OPTIONS预检请求...")
|
||
options_response = requests.options(
|
||
f"{api_base}{endpoint}",
|
||
headers=browser_headers,
|
||
timeout=5
|
||
)
|
||
|
||
print(f" 状态: {options_response.status_code}")
|
||
print(f" Allow-Origin: {options_response.headers.get('Access-Control-Allow-Origin', 'MISSING')}")
|
||
print(f" Allow-Methods: {options_response.headers.get('Access-Control-Allow-Methods', 'MISSING')}")
|
||
print(f" Allow-Headers: {options_response.headers.get('Access-Control-Allow-Headers', 'MISSING')}")
|
||
|
||
# 2. 发送实际请求
|
||
print(" 2️⃣ 实际GET请求...")
|
||
if method == "GET":
|
||
actual_response = requests.get(
|
||
f"{api_base}{endpoint}",
|
||
headers=browser_headers,
|
||
timeout=5
|
||
)
|
||
else:
|
||
continue
|
||
|
||
print(f" 状态: {actual_response.status_code}")
|
||
print(f" Allow-Origin: {actual_response.headers.get('Access-Control-Allow-Origin', 'MISSING')}")
|
||
|
||
if actual_response.status_code == 200:
|
||
print(" ✅ 请求成功")
|
||
else:
|
||
print(f" ❌ 请求失败: {actual_response.status_code}")
|
||
print(f" 错误详情: {actual_response.text[:200]}")
|
||
|
||
except requests.exceptions.ConnectionError:
|
||
print(" ❌ 连接失败 - API服务器未启动")
|
||
break
|
||
except Exception as e:
|
||
print(f" ❌ 异常: {e}")
|
||
|
||
# 特别测试一个可能有问题的端点
|
||
print(f"\n🎯 特别测试: /api/stores (问题端点)")
|
||
try:
|
||
# 完全模拟浏览器的fetch请求
|
||
test_response = requests.get(
|
||
f"{api_base}/api/stores",
|
||
headers={
|
||
'Origin': 'http://localhost:5173',
|
||
'Referer': 'http://localhost:5173/',
|
||
'Accept': 'application/json',
|
||
'Content-Type': 'application/json',
|
||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
|
||
},
|
||
timeout=5
|
||
)
|
||
|
||
print(f"状态码: {test_response.status_code}")
|
||
print(f"响应头:")
|
||
for header, value in test_response.headers.items():
|
||
if 'access-control' in header.lower() or 'cors' in header.lower():
|
||
print(f" {header}: {value}")
|
||
|
||
if test_response.status_code == 200:
|
||
print("✅ /api/stores 端点工作正常")
|
||
else:
|
||
print(f"❌ /api/stores 端点返回: {test_response.status_code}")
|
||
|
||
except Exception as e:
|
||
print(f"❌ /api/stores 测试失败: {e}")
|
||
|
||
print(f"\n" + "=" * 50)
|
||
print("💡 如果看到所有 'Allow-Origin: *',CORS就配置正确了")
|
||
print("🔄 请重启API服务器后重新测试")
|
||
|
||
if __name__ == "__main__":
|
||
immediate_cors_test() |