Django+React : Политика CORS: Поле заголовка запроса access-control-allow-methods не разрешено Access-Control-Allow-Headers в префлайт-ответе
Я использую Django для бэкенда и React для фронтенда. Когда я пытаюсь отправить POST запрос, я получаю :
Access to XMLHttpRequest at 'http://localhost:8000/package/' from origin 'http://localhost:3000' has been blocked by CORS policy: Request header field access-control-allow-methods is not allowed by Access-Control-Allow-Headers in preflight response.
Я объединил множество ответов, которые я нашел, например Как использовать csrf_token в Django RESTful API и React? и Django и React: csrf cookie не устанавливается в заголовке запроса но все равно не повезло.
- 'corsheaders' находится в моих УСТАНОВЛЕННЫХ APPS
- Настройки промежуточного ПО
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
- Настройки СОРС:
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_METHODS = [
"DELETE",
"GET",
"OPTIONS",
"PATCH",
"POST",
"PUT",
]
CORS_ORIGIN_WHITELIST = (
'http://localhost:3000',
)
CORS_ALLOWED_ORIGINS = [
'http://localhost:3000',
]
CSRF_TRUSTED_ORIGINS = ['http://localhost:3000']
from corsheaders.defaults import default_headers
CORS_ALLOW_HEADERS = default_headers + ('cache-control',)
- Django view.py
from django.shortcuts import render
from django.views.generic.edit import CreateView
from .forms import PackageForm
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import ensure_csrf_cookie
class PackageFormView(CreateView):
form_class = PackageForm
initial = {'key': 'value'}
template_name = 'package_form.html'
def get(self, request, *args, **kwargs):
form = self.form_class(initial=self.initial)
return render(request, self.template_name, {'form': form})
@method_decorator(ensure_csrf_cookie)
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
form.save()
return render(request, self.template_name, {'form': form})
- Реагировать на вызов
var csrftoken = getCookie("csrftoken");
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== "") {
var cookies = document.cookie.split(";");
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
if (cookie.substring(0, name.length + 1) === name + "=") {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
const cors = {
"X-CSRFToken": csrftoken,
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Credentials": "true",
"Access-Control-Allow-Methods":
"POST, GET, PUT, DELETE, OPTIONS, HEAD, authorization",
"Access-Control-Allow-Headers": "*",
"Content-type": "application/json",
"withCredentials": "true",
};
axios
.post(
baseURL,
{
title: "title from react",
description: "description from react",
"withCredentials": "true",
},
{
headers: cors,
}
)
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
};
Я уже потратил около 10 часов на это, я все еще не могу найти как это исправить.