React向FastAPI发送请求时触发CORS策略错误,寻求解决方法
看起来你已经尝试配置了FastAPI的CORS中间件,但还是踩了跨域的坑,我来帮你一步步排查解决:
首先,确保FastAPI应用正常加载
从你的Python日志里看到,启动初期出现了Error loading ASGI app. Attribute "app" not found in module "maintest".的错误,虽然之后热重载成功了,但这种加载异常可能导致CORS中间件没有正确初始化。建议你先完全停止服务器,再重新运行启动命令:
uvicorn maintest:app --reload --host 0.0.0.0 --port 8000
等服务器完全启动,确认日志里只有Uvicorn running on http://0.0.0.0:8000和Application startup complete.的提示,没有任何加载错误后,再测试前端请求。
调整CORS配置,覆盖本地开发的所有可能源
有时候浏览器会把localhost和127.0.0.1视为不同的源,虽然你已经添加了这两个地址,但可以先临时放宽配置(仅用于开发环境)来验证问题:
# 替换你的origins配置 origins = [ "http://localhost:3000", "http://127.0.0.1:3000", "http://localhost", "http://127.0.0.1" ]
或者更激进一点,临时用allow_origins=["*"]测试(生产环境绝对不能这么做):
app.add_middleware( CORSMiddleware, allow_origins=["*"], # 仅开发测试用 allow_credentials=True, allow_methods=["*"], allow_headers=["*"], )
如果这样能解决问题,说明是源地址匹配的问题,之后再调整回具体的origins列表即可。
用React代理绕过CORS(开发环境最省心方案)
React自带了代理功能,你可以在前端项目的package.json里添加代理配置:
"proxy": "http://localhost:8000"
然后修改前端的fetch代码,去掉完整的URL,只用路径:
const response = await fetch("/predict/", { method: "POST", credentials: 'include', headers: { "Content-Type": "application/json", }, body: JSON.stringify(formData), });
这样React会自动把请求转发到后端,绕过浏览器的CORS检查,本地开发用这个方法几乎不会踩跨域的坑。
验证后端接口本身是否正常
先排除后端接口的问题,用curl直接请求后端:
curl -X POST http://localhost:8000/predict/ -H "Content-Type: application/json" -d '{"mean_radius":1, "mean_texture":2, "mean_perimeter":3, "mean_area":4}'
如果能得到{"prediction":10}的响应,说明后端接口没问题,问题肯定出在CORS配置或者请求方式上。
最后检查代码细节
确认你的maintest.py里的FastAPI实例拼写正确,是app = FastAPI(),没有写成App或者其他错误的变量名,这是导致启动初期加载错误的常见原因。
备注:内容来源于stack exchange,提问作者dixhom

