Метод PUT не разрешен Access-Control-Allow-Methods в предполетном ответе FLASK CORS

GET работают правильно. Кажется, я не могу заставить PUT работать, и я боюсь, что POST тоже не работает.

Продолжал иметь ошибку

Access to XMLHttpRequest at '<...>' from origin 'https://localhost:3000' has been blocked by CORS policy: Method PUT is not allowed by Access-Control-Allow-Methods in preflight response.

У меня есть локальное веб-приложение, которое вызывает внешний API, а это означает, что CORS будет одним из препятствий, которые мне нужно решить.

Вот мой код фляги.

@blueprint.route('/profiles/<oi_id>', methods=['POST'])
@cross_origin(send_wildcard=True, methods=['POST', 'OPTIONS'])
def create_checkin_profile(oi_id):
    return jsonify(cph.create_owner_profile_info(oi_id, json.loads(request.data)))


@blueprint.route('/profiles/<oi_id>', methods=['PUT'])
@cross_origin(send_wildcard=True, methods=['PUT', 'OPTIONS'])
def edit_checkin_profile(oi_id):
    return jsonify(cph.edit_owner_profile_info(oi_id, json.loads(request.data)))

Это довольно запутанно, так как я уверен, что разрешил PUT. Я использую axios для этого в приложении для реагирования. Вот моя функция call-api.

axios({
      method: 'PUT',
      url: url,
      timeout: 3000,
      data: data,
      headers: {
        "Access-Control-Allow-Origin": "*",
        "Content-Type": "application/json",
        Accept: "application/json",
      },
    });

person Franrey Saycon    schedule 26.11.2018    source источник
comment
Со стороны React мне кажется, что ваши реализации верны, пожалуйста, проверьте, как обрабатывать cors в flask.   -  person Satyaki    schedule 26.11.2018
comment
Я только что использовал Flask-Cors. Декоратор @cross_origin(), в котором он должен хорошо обрабатывать запросы CORS. Вот почему я смущен, почему это не работает.   -  person Franrey Saycon    schedule 26.11.2018
comment
Я не питончик. Так что не могу подтвердить, но это может вам помочь: stackoverflow.com/questions/39550920/   -  person Satyaki    schedule 26.11.2018


Ответы (1)


Хорошо, я исправил это. По-видимому, согласно документам, я должен указать «Content-Type» в запросах перекрестного происхождения. Вот так:

@cross_origin(allow_headers=['Content-Type'])

Не обманывайтесь тем, что по умолчанию разрешено все. Вы должны указать это, по-видимому.

Мне нужно удалить ненужные заголовки, такие как Accept и Access-Control-Allow-Origin. Обновление моих аксиом так:

axios({
    method: 'PUT',
    url: url,
    timeout: 3000,
    data: data,
    headers: {
        "Content-Type": "application/json",
    },
});

БОНУС:

Я столкнулся с проблемой, если мои вызовы API возвращали ответ, отличный от 200, с предварительным запросом, тело ответа становится нулевым. Я только что добавил эти строки кода в свое основное приложение. Мне нужно тело для деталей ошибки там.

@app.after_request
def set_cors_header(response):
    response.headers['Access-Control-Allow-Origin'] = '*'
    return response
person Franrey Saycon    schedule 27.11.2018