Flask-CORS未按配置拒绝跨域请求问题求助
解决Flask-CORS与Flask-RESTPlus蓝图搭配时CORS规则不生效的问题
我之前也碰到过一模一样的情况,问题核心在于你把CORS配置绑定到了主Flask app实例上,但所有API路由都属于后续注册的蓝图,导致CORS的限制规则根本没作用到实际的API路由上,自然就会允许所有源访问。
问题根源拆解
你的初始化流程是这样的:
- 创建主
app实例并配置CORS规则 - 把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-endpointAccess-Control-Allow-Origin头;而来自xxx.mydomain.com的请求会返回对应的允许头。
内容的提问来源于stack exchange,提问作者Gerdson Silva




