前端AJAX调用Databricks API遇CORS拦截,Flask配置CORS无效
我尝试在前端通过AJAX发送GET请求,从Flask后端通过{{job_id}}获取job_id,前端AJAX代码如下:
function resultNotebook() { var jobRaw = '{{job_id}}'; var job = jobRaw.split(''').join('"'); var id = job.replace(/\D/g,''); console.log(job); console.log(id); $.ajax( "https://adb.14.azuredatabricks.net/api/2.0/jobs/runs/get", { type: "get", headers:{'Authorization': 'Bearer <TOKEN>' }, async: false, dataType: "json", data: { "run_id":id }, success: function (response) { console.log(response); }, error: function (errorMessage) { console.log(errorMessage); }, } ); } document.getElementById("execute").addEventListener("click", resultNotebook);
我已在Flask后端按如下方式配置flask_cors,但仍收到CORS拦截错误:
Access to XMLHttpRequest at 'https://adb.azuredatabricks.net/api/2.0/jobs/runs/get?run_id=10211260' from origin 'http://localhost:5000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
后端配置代码如下:
from flask_cors import CORS app = Flask(__name__) CORS(app, supports_credentials=True) app.config['CORS_HEADERS'] = 'Content-Type'
问题分析
你的AJAX请求是直接发送给Azure Databricks第三方API,而非你的Flask后端。Flask的CORS配置仅对自身提供的接口生效,无法控制第三方服务的CORS策略,这就是配置了flask_cors依然报错的核心原因。
解决方案
方案1:通过Flask后端做请求代理
这是最稳妥的解决方式,让前端请求自己的Flask后端,再由后端转发请求到Databricks API:
- 在Flask后端新增代理路由:
import requests from flask import request, jsonify @app.route('/get-databricks-run', methods=['GET']) def get_databricks_run(): run_id = request.args.get('run_id') if not run_id: return jsonify({'error': 'run_id参数必填'}), 400 # 转发请求到Databricks API url = f"https://adb.14.azuredatabricks.net/api/2.0/jobs/runs/get?run_id={run_id}" headers = {'Authorization': 'Bearer <TOKEN>'} response = requests.get(url, headers=headers) # 将Databricks的响应返回给前端 return jsonify(response.json()), response.status_code
- 修改前端AJAX代码,改为请求Flask代理路由:
function resultNotebook() { var jobRaw = '{{job_id}}'; var job = jobRaw.split(''').join('"'); var id = job.replace(/\D/g,''); console.log(job); console.log(id); $.ajax( "/get-databricks-run", { type: "get", async: false, dataType: "json", data: { "run_id":id }, success: function (response) { console.log(response); }, error: function (errorMessage) { console.log(errorMessage); }, } ); } document.getElementById("execute").addEventListener("click", resultNotebook);
方案2:尝试配置Databricks API的CORS规则
部分云服务允许自定义CORS规则,你可以登录Azure Databricks控制台,查看是否能将http://localhost:5000添加到允许的来源列表中。但需要注意,Databricks API通常不推荐前端直接调用(存在Token泄露风险),因此更建议使用代理方案。
内容的提问来源于stack exchange,提问作者Rio

