flask默认拒绝跨域请求是因为其不内置cors支持,且不响应预检options请求,导致浏览器拦截响应;需用flask-cors扩展或手动正确处理预检及响应头。

为什么 Flask 默认拒绝跨域请求
Flask 本身不内置 CORS 支持,浏览器发起的 fetch 或 XMLHttpRequest 跨域请求会触发预检(OPTIONS),而 Flask 的路由默认不响应这类请求,直接返回 405 或空响应,导致前端报错 No 'Access-Control-Allow-Origin' header。
这不是 Flask “出错了”,而是它严格遵循同源策略——你没显式允许,它就拒绝。
- 常见错误现象:前端控制台出现
Failed to fetch或CORS header ‘Access-Control-Allow-Origin’ missing - 典型场景:Vue/React 前端跑在
http://localhost:5173,Flask 后端在http://localhost:5000 - 注意:即使后端返回了数据,只要响应头缺
Access-Control-Allow-Origin,浏览器仍会拦截响应体
用 flask-cors 扩展最稳妥地启用全局 CORS
手动拼接响应头容易遗漏 OPTIONS 处理、凭证支持、方法白名单等细节,推荐直接使用 flask-cors——它已覆盖所有主流 CORS 场景。
安装并初始化:
pip install flask-cors
在 Flask 应用中添加:
from flask import Flask<br>from flask_cors import CORS<br><br>app = Flask(__name__)<br># 允许所有来源(开发用)<br>CORS(app)
- 若只允许特定前端:用
CORS(app, origins=["http://localhost:5173"]) - 需携带 Cookie 或 Authorization 头时,必须加
supports_credentials=True,且前端fetch要设credentials: "include" - 不要同时用
@cross_origin()装饰器和全局CORS(app),否则可能重复设置头或冲突
不用扩展时,手动处理 OPTIONS 预检和响应头的要点
如果因环境限制不能装第三方包,必须手写,关键不是只加几个头,而是必须正确响应预检请求。
错误做法:只在主路由加 Access-Control-Allow-Origin,却不处理 OPTIONS。
- 对每个需要跨域的接口,要么单独写一个
OPTIONS路由,要么用@app.after_request统一注入头 - 预检必须返回 200,且包含:
Access-Control-Allow-Methods、Access-Control-Allow-Headers、Access-Control-Allow-Origin - 若前端发了自定义头(如
X-Auth-Token),必须显式列在Access-Control-Allow-Headers中,不能用* - 示例(统一注入):
@app.after_request<br>def after_request(response):<br> response.headers.add("Access-Control-Allow-Origin", "http://localhost:5173")<br> response.headers.add("Access-Control-Allow-Headers", "Content-Type,Authorization,X-Auth-Token")<br> response.headers.add("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS")<br> return response<br><br>@app.route("/api/data", methods=["GET", "OPTIONS"])<br>def get_data():<br> if request.method == "OPTIONS":<br> return "", 200 # 必须返回 200,不能是空响应或重定向 return {"data": "ok"}
生产环境必须注意的三个限制
开发时设 origins="*" 很方便,但上线后这会引发安全问题或功能异常。
-
Access-Control-Allow-Origin不支持多个值,也不能是"*"+supports_credentials=True,二者互斥 - 如果前端需要带 Cookie,后端必须指定具体域名(不能用通配符),且
Access-Control-Allow-Credentials设为True - Nginx 反向代理 Flask 时,CORS 头可能被代理层覆盖或过滤,此时应在 Nginx 配置里补全相关头,而不是只依赖 Flask
真正难的不是加几行代码,而是判断“谁在发请求”“带了什么头”“要不要凭证”——这些信息得从前端调用方式里反推,不能靠猜。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











