You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask配置CORS仍报错:缺少Access-Control-Allow-Origin响应头

解决Flask-CORS配置后仍出现跨域错误的问题

核心问题原因

你同时使用了Flask-CORS和自定义的after_request函数添加CORS响应头,这会导致以下冲突:

  1. Flask-CORS已经自动处理OPTIONS预检请求并添加标准CORS头,手动添加的头会重复或覆盖正确的响应头
  2. response.headers.add()会导致同一个Access-Control-Allow-Origin头多次出现,浏览器会直接忽略这类非法响应头,触发CORS报错

修复步骤

1. 移除自定义的after_request函数

修改__init__.py,删除整个@app.after_request装饰的函数块,保留Flask-CORS的配置即可:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_cors import CORS

db = SQLAlchemy()
bcrypt = Bcrypt()

def create_app():
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    app.secret_key = 'supersecretkey'

    db.init_app(app)
    bcrypt.init_app(app)

    # 简化CORS配置,仅允许指定源的跨域请求,支持凭证
    CORS(app, origins="http://localhost:3000", supports_credentials=True)

    from .routes import main
    app.register_blueprint(main)

    return app

2. 验证Flask应用启动方式

确保你是通过工厂函数create_app()创建的应用实例,启动文件示例:

from your_app_module import create_app

app = create_app()

if __name__ == '__main__':
    app.run(debug=True)

3. 手动测试OPTIONS预检请求

用curl命令验证CORS头是否正常返回:

curl -X OPTIONS http://localhost:5000/test \
  -H "Origin: http://localhost:3000" \
  -H "Access-Control-Request-Method: GET" \
  -v

如果响应头中包含Access-Control-Allow-Origin: http://localhost:3000,说明配置生效。

4. 前端可选配置(如需凭证)

如果你的请求需要携带Cookie等凭证,在axios请求中开启withCredentials:

axios.get('http://localhost:5000/test', { withCredentials: true })
  .then(response => console.log(response.data))
  .catch(error => console.error(error));

额外排查建议

  • 升级Flask-CORS到最新版本:pip install --upgrade flask-cors
  • 检查是否有其他Flask扩展或中间件修改了响应头
  • 确保后端服务确实运行在http://localhost:5000,前端运行在http://localhost:3000,端口无冲突

内容的提问来源于stack exchange,提问作者Parzival

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 03:16:05