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

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

火山引擎 最新活动