POST 请求在 Python 后端被阻止。 GET 请求工作正常

POST request gets blocked on Python backend. GET request works fine

我正在构建一个 Web 应用程序,其中 front-end 使用 Flutter 完成,而 back-end 使用 Python。 GET 请求工作正常,而 POST 请求由于 CORS 而被阻止,我收到此错误消息:

Access to XMLHttpRequest at 'http://127.0.0.1:8080/signal' from origin 'http://localhost:57765' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

下面是我用来发送 GET 和 POST 请求的 flutter 函数:

  Future<dynamic> sendResponse() async {
    final url = 'http://127.0.0.1:8080/signal';
    var data = {
      "signal": '8',
    };
    var header = {
      'Access-Control-Allow-Origin': '*',
      "Accept": "application/x-www-form-urlencoded, '*'"
    };


    http.Response response = await http.post(Uri.parse(url), body: data, headers: header);//http.post(Uri.parse(url), body: data, headers: header);//http.get(Uri.parse(url));
    if (response.statusCode == 200) {
      print(json.decode(response.body));
      return jsonDecode(response.body);
      //print(json.decode(credentials.body));
    } else {
      print(response.statusCode);
      throw Exception('Failed to load Entry');
    }

   // var ResponseFromPython = await response.body;//jsonDecode(credentials.body);

   // return ResponseFromPython;
  }

下面是我使用 Flask 的 Python 后端代码:

   from flask import Flask,jsonify, request, make_response
   import json


   from flask_cors import CORS, cross_origin


   #declared an empty variable for reassignment
   response = ''

   app = Flask(__name__)

   #CORS(app, resources={r"/signal": {"origins": "*, http://localhost:59001"}}) 
   #http://localhost:52857
   #CORS(app, origins=['*'])
   app.config['CORS_HEADERS'] = ['Content-Type','Authorization']



   @app.route("/")
   def index():
    
    return "Congratulations, it worked"

   @app.route("/signal", methods = ['POST', 'GET']) #,
   @cross_origin(origins='http://localhost:57765',headers=['Content-Type','Authorization', 
   'application/x-www-form-urlencoded','*'], upports_credentials=True)# allow all origins all 
   methods.
   def multbytwo():
       """multiple signal by 2 just to test."""
       global response
       if (request.method=='POST'):
       # request.headers.add("Access-Control-Allow-Origin", "*")
           request_data = request.data #getting the response data
           request_data = json.loads(request_data.decode('utf-8')) #converting it from json to key 
   value pair
           comingSignal = request_data['signal']
           response = make_response(comingSignal, 201)#jsonify(comingSignal*2)
           response.headers.add('Access-Control-Allow-Origin', '*')
           response.headers.add('Access-Control-Allow-Methods", "DELETE, POST, GET, OPTIONS')
           response.headers.add('Access-Control-Allow-Headers", "Content-Type, Authorization, X- 
  Requested-With')
           return response
       else:
           try:
        #scaler = request.args.get("signal")
               out = 9 * 2 
         
               response = jsonify(out)
               response.headers.add("Access-Control-Allow-Origin", "*") 
               return response #sending data back to your frontend app

           except ValueError:
               return "invalid input xyz"

   if __name__ == "__main__":
       app.run(host="127.0.0.1", port=8080, debug=True)

以下是我进行的故障排除步骤: -在 python 中添加了 flask_CORS 包 我在这里尝试使用 CORS(app, resources={r"/signal": {"origins": "*"}}) 等一般参数的不同组合没有帮助。还尝试了装饰器@cross-origin但没有帮助

-向响应本身添加一些 header 以表明它接受 cross-origin 您在我的 python 代码中看到,我尝试在响应中添加很多 header,但似乎没有任何响应。

- 尝试在 Chrome 中安装扩展,by-passes CORS 检查 我尝试了 allow CORSCORS unblock 扩展,并使用了此答案中描述的步骤:How chrome extensions be enabled when flutter web debugging?。尽管这些扩展应该将 CORS 允许 header 添加到响应中,但我仍然遇到相同的错误。

我仍然不完全理解 CORS 的概念,但我尝试了很多 work-arounds 但没有任何效果!请帮忙

Flask 有一个 @app.after_request 装饰器,这帮助我确保 headers 得到添加,无论路由

中发生什么
@app.after_request
def add_cors_headers(resp):
    resp.headers.add('Access-Control-Allow-Origin', '*')
    resp.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')
    resp.headers.add('Access-Control-Allow-Methods', 'GET,POST,PUT,DELETE,OPTIONS')

这解决了我的 CORS 问题!

我终于明白是怎么回事了。 首先,我在 chrome 中使用以下命令禁用了同源策略: 这是 运行 单击 windows 中的开始按钮并直接键入此命令。 .

chrome.exe  --disable-site-isolation-trials --disable-web-security --user-data-dir="D:\anything"

这触发了一个单独的 chrome window,它不会阻塞 cross-origin,我们将其称为 CORS 免费 window。这使我最终能够与我的 python 代码进行通信并了解发生了什么。

您可以看到 chrome 默认设置甚至没有向我显示与响应相关的任何内容,只显示 500 代码错误。

我复制了本地主机 link 和端口并将它们粘贴到我的另一个 CORS 免费 chrome window 另一个 CORS free chrome window 显示了有用的信息:

这是一个简单的 JSON 解码错误! 我回到我的 flutter 代码并更改了 http post 请求,添加了一个 [= post 主体上的 12=] 函数:

http.Response response = await http.post(Uri.parse(url), body:jsonEncode(data), headers: header);

现在 post 请求 returns 对默认 chrome 设置的正确响应。 正是这个 CORS 完全阻止了响应让我 handi-capped.