部署Google Cloud Run后Flask API遇CORS策略拦截问题求助
Cloud Run部署Flask API后CORS错误的排查与解决
一、先核对接口路由匹配
你JS代码请求的是/getOpenedAccounts/<uid>,但Flask代码里仅定义了/getCustomerDetails/<customerID>路由——如果这不是粘贴失误,这是核心问题:请求的接口不存在,预请求(OPTIONS)自然无法返回正确的CORS响应头。先确认JS请求路径和Flask路由完全一致。
二、优化Flask CORS配置
你已经引入flask-cors并全局初始化CORS(app),但又手动添加Access-Control-Allow-Origin头,这可能导致头重复或配置冲突。建议:
- 删除手动添加的
resp.headers['Access-Control-Allow-Origin'] = '*',交由flask-cors统一处理CORS逻辑 - 生产环境建议显式指定允许的源,而非通配符,示例:
CORS(app, origins=["https://你的Web应用域名"]) - 确保
flask-cors依赖为最新版本,旧版本可能存在兼容性问题
三、Cloud Run层面排查
Cloud Run默认不会拦截CORS响应头,但需检查以下场景:
- 若使用自定义域名或Cloud CDN,确认CDN缓存规则未缓存OPTIONS请求的响应,否则可能导致CORS头丢失
- 核对Cloud Run服务配置的容器端口与Flask监听端口一致(Flask默认5000),端口不匹配会导致请求无法到达应用
- 查看Cloud Run日志,确认OPTIONS请求是否成功到达Flask应用,以及响应头中是否包含
Access-Control-Allow-Origin
四、必须修复的SQL注入漏洞
你的Flask代码通过字符串拼接构造SQL语句:
query1 = ("select * from customer Where customerID = '" + customerID +"';")
这存在严重的SQL注入风险,必须改为参数化查询:
query1 = "select * from customer Where customerID = %s;" cursor.execute(query1, (customerID,))
五、快速测试方法
用curl直接测试API的OPTIONS请求,验证响应头:
curl -X OPTIONS -H "Origin: https://你的Web应用域名" -i https://你的CloudRunAPI域名/getCustomerDetails/testID
若响应中无Access-Control-Allow-Origin,问题出在Flask配置;若有,则需排查Web应用端或中间层拦截问题。
内容的提问来源于stack exchange,提问作者belbel
相关产品推荐
相关产品推荐

