You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flask-CORS未按配置拒绝跨域请求问题求助

解决Flask-CORS与Flask-RESTPlus蓝图搭配时CORS规则不生效的问题

我之前也碰到过一模一样的情况,问题核心在于你把CORS配置绑定到了主Flask app实例上,但所有API路由都属于后续注册的蓝图,导致CORS的限制规则根本没作用到实际的API路由上,自然就会允许所有源访问。

问题根源拆解

你的初始化流程是这样的:

  1. 创建主app实例并配置CORS规则
  2. 把API蓝图注册到app上

但Flask-CORS在绑定到app时,只会对当时已存在的路由生效,后续新增的蓝图路由不会自动继承这些规则。而你的所有API接口都挂在BLUEPRINT这个蓝图里,所以之前的CORS配置等于没覆盖到实际需要限制的路由。

具体修复方案

把CORS配置直接绑定到你的API蓝图上,而非主app。修改app/__init__.py文件:

from flask_restplus import Api
from flask import Blueprint
from flask_cors import CORS

# 声明API蓝图
BLUEPRINT = Blueprint("api", __name__)
# 给蓝图配置CORS规则
CORS(BLUEPRINT, resources={r"/*": {"origins": r".*\.mydomain\.com"}})
# 初始化Flask-RESTPlus的Api到蓝图
API = Api(BLUEPRINT)

同时记得删掉app/main/__init__.py里原来的CORS(app, ...)配置行,避免重复配置冲突。

额外注意事项

  • 修正正则表达式:你原来的r".*\.mydomain.com"里,最后一个.com的点没有转义,应该改成r".*\.mydomain\.com",否则会匹配任意字符而非实际的点
  • 检查视图函数:如果某个视图单独用了@cross_origin()装饰器,会覆盖全局CORS配置,需要去掉或者调整装饰器的参数
  • 验证方法:用curl模拟跨域请求测试响应头
    curl -H "Origin: https://unallowed-domain.com" -I https://your-api-address/your-endpoint
    
    配置正确的话,非允许源的请求不会返回Access-Control-Allow-Origin头;而来自xxx.mydomain.com的请求会返回对应的允许头。

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

火山引擎 最新活动