Метод PUT не разрешен Access-Control-Allow-Methods в предварительном ответе FLASK CORS
GETs работают правильно. Я не могу заставить 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",
},
});
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