【问题标题】:"Method Not Allowed The method is not allowed for the requested URL" even with methods = ["POST"] enabled?即使启用了methods = [“POST”],“方法不允许请求的URL也不允许该方法”?
【发布时间】:2021-11-13 05:45:44
【问题描述】:

在 render.html 文件中,我有一个按钮,可以调用 render.js 中的函数(我在脚本中包含了 render.js 作为 src)

<button type="button" onclick="someFunc()">Calculate</button>

在 render.js 中 someFunc() 发出请求

options =  {
        method: "POST",
        headers: {
           "Content-Type" : "application/json"
        },
        body: JSON.stringify(feat1dataObj)
    }

    const test1 = await fetch('http://localhost:5000/analyzeInput', options)

app.py 是应该处理请求的后端

from flask import Flask, jsonify, request

app = Flask(__name__);

@app.route('/analyzeInput', methods = ['POST'] )
def analyzeData(res):
    part1Len = request.json['part1Len']
    print(part1Len);
    res = jsonify( {"Testing":"1"} )
    res.headers.add('Access-Control-Allow-Origin', '*')
    res.headers.set('Access-Control-Allow-Methods', 'GET, POST')
    return res;


#start server
if __name__ == "__main__":
    app.run(debug=True);

但我得到 405 ""Method Not Allowed The method is not allowed for the requested URL";典型的解决方案是 method = ["POST"] 不包括在内,但我有。

GitBash terminal Output

好像我正在以某种方式发出 GET 请求?

总的来说,我是用 ElectronJS 做一个 GUI,只是想把数据从 GUI 传递到 Python 脚本来处理,不知道为什么教程推荐托管;似乎应该有一种更简单的方法来做到这一点。

编辑:

@app.route('/analyzeInput', methods = ['GET', 'POST', 'OPTIONS'] )
#def analyzeData(res):
#def analyzeData(request):
def analyzeData():
  if request.method == 'POST': 
    print("entered analyzeInput")
    #part1Len = request.json['part1Len']
    #print(part1Len);
    res = jsonify( {"Testing":"1"} )
    res.headers.add('Access-Control-Allow-Origin', '*')
    #res.headers.set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
    res.headers.add('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept')
    return res;

代码目前看起来像这样(我将analyzeData 更改为analyzeInput;并在各处进行了更改,因此我不必担心那部分)。获取“'analyzeData' 的视图函数未返回有效响应。该函数返回 None 或在没有返回语句的情况下结束”作为内部服务器错误。

再次,很确定问题在于请求是作为“GET”而不是“POST”发送的,但找不到对此的解释。 New output

【问题讨论】:

    标签: javascript python flask electron localhost


    【解决方案1】:

    除了@john mba 的回答,您还应该在选项中添加mode: “cors”

    【讨论】:

    • 您的意思是添加到options = { method: "POST", headers: ...} ?我尝试了这个建议,但仍然遇到同样的错误。
    • 是的。呃,如果你在你的 flash 后端也允许 GET 请求会发生什么?然后,您应该使用if request.method == “POST”: 在您的 Python 代码中显式检查 POST 请求,并在以下块中执行您想要在 POST 请求中执行的所有代码。
    • 尝试了您的建议并收到内部服务器错误。 Tbh 我认为主要线索在控制台输出/附加图片中?它不是以某种方式发送 GET 请求而不是 POST 吗?
    【解决方案2】:

    这是跨站点起源 (CORS) 问题。从您的代码中,我可以看到您已经解决了这个问题,但是在 app.route 添加如下选项: @app.route('/analyzeInput', methods = ['POST', 'OPTIONS'] ) 。原因是浏览器根据2014年生效的跨站起源(CORS)政策重写了请求,将请求方式改为options。

    【讨论】:

    • 我尝试了 methods = [] 中的建议并得到了同样的错误;另外我也添加到res.headers.set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'),但它仍然不起作用
    • 在您的 analyseData 视图函数中我看到了这个 res.headers.set('Access-Control-Allow-Methods', 'GET, POST');您正在设置而不是添加,尽管您可以完全删除该行,但不需要它,因为您已经在 methods=[] 中允许了请求方法。并请发布错误。
    • 提出了你的建议,它似乎已经摆脱了 405 错误代码;但仍然得到 500 内部服务器错误。看我贴的新图片,粉红色的是GET请求不是吗?然后 if 语句被完全跳过并且不返回任何内容 -> 抛出错误“'analyzeData' 的视图函数没有返回有效响应。该函数返回 None 或在没有返回语句的情况下结束。”我只是不知道为什么它是一个 GET 请求。
    • 抱歉来晚了;您以错误的方式发送请求。检查这个网站:geeksforgeeks.org/get-and-post-method-using-fetch-api。注意:你的方法不应该是选项,但仍然是正常的 post 方法。
    • 至于内部服务器错误,您以错误的方式发送发布请求,这种方式更像是获取请求,这就是为什么您会收到内部服务器错误,因为视图功能是并非旨在根据获取请求返回某些内容。
    猜你喜欢
    • 2016-12-12
    • 2017-01-10
    • 2016-04-23
    • 2021-08-16
    • 2014-01-08
    • 2020-07-30
    • 2020-08-27
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多