CORS выдает Flask вызов API из React как на локальном хосте - PullRequest
0 голосов
/ 05 марта 2020

Я звоню по Flask API из React (оба работают на localhost), и у меня возникают проблемы с CORS. Когда запрос сделан, браузер (Chrome) выдает следующую ошибку

Access to XMLHttpRequest at 'http://localhost:5000/sas' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: Redirect is not allowed for a preflight request.

Настройка

Настройка Flask следующая

from flask_cors import CORS
from flask import Flask, request, Response
from flask_restful import Api, Resource
import json

class SAS(Resource):
    def get(self):
        content = request.json
        js = json.dumps(
            {
                "Response": "Some response"
            }
        )
        resp = Response(js, status=200, mimetype='application/json')
        return resp

app = Flask(__name__)
cors = CORS(app)
api = Api(app)
api.add_resource(SAS, '/sas/')

Вызов с использованием ax ios в React выглядит следующим образом:

  buttonPressed = async event => {
    event.preventDefault();
    const response = await axios.get(`http://localhost:5000/sas`, {
      data: {
        user: "user",
        file_name: "user",
        directory_name: "user"
      }
    });
  };

ПРИМЕЧАНИЕ. Запуск запроса от Postman работает и показывает заголовок Access-Control-Allow-Origin = *

Любая идея о том, как решить проблему ?

Кроме того, если бы я должен был запускать интерфейс и API React как докеризованное приложение, я не должен больше видеть эту проблему правильной? В этом случае я бы также подумал об обходе проблемы во время разработки

1 Ответ

0 голосов
/ 05 марта 2020

Попробуйте использовать декоратор cross_origin, как в этом минимальном примере:

from flask import Flask, request, jsonify
from flask_cors import CORS, cross_origin
app = Flask(__name__)
CORS(app, support_credentials=True)

@app.route('/sas', methods=['POST', 'GET', 'OPTIONS'])
@cross_origin(supports_credentials=True)
def index():
    if(request.method=='POST'):
     some_json = request.get_json()
     return jsonify({"key": some_json})
    else:
        return jsonify({"GET": "Nice Get Request"})

if __name__=="__main__":
    app.run(host='0.0.0.0', port=5000)

Если это сработает, мы перейдем к реализации того же декоратора в вашем коде.

...