Flask与JavaScript交互出现405 Method Not Allowed错误求助
解决Flask与JavaScript交互的405 Method Not Allowed错误
嘿,我一眼就瞅出问题所在啦!你的405错误根源非常明确——请求方法不匹配:
- 你的JavaScript代码里,
fetch默认使用的是GET方法(如果不指定method参数,fetch会默认用GET); - 但你Flask后端的
/api/prediction_lime路由,只配置了接受POST请求(methods=['POST']),服务器自然会拒绝不被允许的GET请求,返回405错误。
下面给你两种针对性的解决方案,你可以根据实际需求选择:
方案1:修改JavaScript请求为POST方法(推荐,如果接口需要提交数据)
如果这个接口本来就应该用POST(比如需要向服务器传递参数),那你需要给fetch加上method配置,同时设置正确的请求头:
fetch('http://127.0.0.1:5053/api/prediction_lime', { method: 'POST', // 明确指定POST方法 headers: { 'Content-Type': 'application/json', // 告诉服务器我们传的是JSON格式 }, // 如果需要传递参数,在这里添加body(比如你要传的参数对象) // body: JSON.stringify({ key: 'value' }), }) .then(function (response) { const contentType = response.headers.get("content-type"); if (contentType && contentType.indexOf("application/json") !== -1) { if (response.ok) { response.json().then(function (json) { app.showOneResult(0, json); }) } else { // 可以在这里处理非成功的响应,比如打印错误状态码 console.error('请求失败,状态码:', response.status); } } }) .catch(error => console.error('请求过程出错:', error));
方案2:修改Flask路由允许GET方法(如果接口只是获取数据)
如果这个接口不需要提交数据,只是用来获取静态的JSON文件内容,那你可以修改Flask的路由配置,让它同时接受GET和POST请求:
@app.route('/api/prediction_lime', methods=['POST', 'GET']) # 加上GET方法 def prediction(): # 区分处理GET和POST请求 if request.method == 'GET': # GET请求不需要解析JSON参数,直接返回数据 with open('prediction_lime.json', encoding='utf8') as f: data = json.load(f) return jsonify(data) # POST请求的原有逻辑保持不变 params = request.get_json(force=True) print(params) with open('prediction_lime.json', encoding='utf8') as f: data = json.load(f) return jsonify(data)
额外小提示
解决完方法不匹配的问题后,如果还是遇到跨域相关的错误,可以再检查你的CORS配置:当前你只允许http://127.0.0.1:8080的跨域请求,确保你的前端确实是运行在这个地址和端口上哦。
内容的提问来源于stack exchange,提问作者KRdg




