FastAPI配置CORSMiddleware不生效,如何正确定义允许的访问源?
问题原因
CORS是浏览器层面的跨域安全控制策略,仅在浏览器环境下生效。服务端CORS中间件的作用是给合法跨域请求的响应添加对应的控制头,由浏览器判断是否拦截响应内容,而非直接在服务端拒绝所有非允许源的请求。
你使用curl、Postman这类工具发起请求时,工具默认不会执行CORS校验逻辑,所以无论请求源是否在允许列表中,都能正常拿到响应,这属于正常现象,不代表CORS配置没有生效。
验证CORS配置生效的正确方法
在curl请求中手动添加Origin请求头,模拟浏览器跨域请求场景:
curl -X 'GET' \ 'http://x.x.x.x:8000' \ -H 'accept: application/json' \ -H 'Origin: http://未允许的测试域名' \ -v
如果源不在你的允许列表中,你会发现响应头中不存在Access-Control-Allow-Origin字段,这种情况下浏览器收到响应后会自动拦截,前端代码无法获取响应内容,说明你的CORS配置已经正常工作。
你当前的CORS配置完全符合FastAPI官方规范,无需调整配置内容,实际部署后前端跨域请求时会自动触发浏览器的CORS校验逻辑。
服务端直接拦截非法源的实现方案
如果你需要在服务端就直接拒绝非允许源的请求,不让非法请求拿到返回内容,可以自定义源校验中间件,示例代码如下:
from fastapi import Request, status from fastapi.responses import JSONResponse # 你的允许源列表 ALLOWED_ORIGINS = {"http://xxxxxxx.appspot.com"} # 注意该中间件要添加在CORSMiddleware之前 @app.middleware("http") async def origin_check_middleware(request: Request, call_next): origin = request.headers.get("origin") if origin and origin not in ALLOWED_ORIGINS: return JSONResponse( status_code=status.HTTP_403_FORBIDDEN, content={"detail": "当前请求源不被允许访问"} ) response = await call_next(request) return response
内容的提问来源于stack exchange,提问作者cYbersYn
相关产品推荐
相关产品推荐

