Как разрешить CORS из запроса Axios get в бэкенде Django?
Я искал решение этой проблемы, но, похоже, ничего не работает. Я пришел к пакету django-cors-headers, но не могу заставить его работать.
Я посылаю axios
запрос форме моего vue
фронтенда:
axios.get('data/')
.then(res => { console.log(res) })
но выдает ошибку 200 network error
:
Access to XMLHttpRequest at 'http://localhost:8000/data/' from origin 'http://localhost:3000' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.
GET http://localhost:8000/data/ net::ERR_FAILED 200
AxiosError {message: 'Network Error', name: 'AxiosError', code: 'ERR_NETWORK', config: {…}, request: XMLHttpRequest, …}
code
:
"ERR_NETWORK"
config
:
{transitional: {…}, adapter: Array(2), transformRequest: Array(1), transformResponse: Array(1), timeout: 0, …}
message
:
"Network Error"
name
:
"AxiosError"
request
:
XMLHttpRequest {onreadystatechange: null, readyState: 4, timeout: 0, withCredentials: true, upload: XMLHttpRequestUpload, …}
stack
:
"AxiosError: Network Error\n
Django backend
Я перенаправляю входящий запрос в myProject/urls.py
:
from django.urls import path, include
urlpatterns = [
path('', include('myApp.urls')),
]
к myApp/urls.py
:
from django.urls import path
from . import views
urlpatterns = [
path('data/', views.getData)
]
который вызывает myApp/views.py
:
from rest_framework.response import Response
from rest_framework.decorators import api_view
from base.models import Item
from .serializers import ItemSerializer
@api_view(['GET'])
def getData(request):
items = Item.objects.all()
serializer = ItemSerializer(items, many=True)
return Response(serializer.data)
с base/models.py
:
from django.db import models
class Item(models.Model):
name = models.CharField(max_length=200)
created = models.DateTimeField(auto_now_add=True)
и myApp/serializers.py
:
from rest_framework import serializers
from base.models import Item
class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = Item
fields = '__all__'
Я установил пакет django-cors-headers
и настроил его в myProject/settings.py
:
INSTALLED_APPS = [
'corsheaders',
...
]
MIDDLEWARE = [
"corsheaders.middleware.CorsMiddleware",
]
с любым из них:
CORS_ALLOWED_ORIGINS = [
"http://localhost:3000",
]
или
CORS_ALLOW_ALL_ORIGINS = True
но ни один из них не работает. Я пробовал читать док-ты по пакету , но не могу найти ошибку.
выбрасывает ошибку 200 сетевой ошибки
Не существует такого понятия, как "сетевая ошибка 200": если вы получили код состояния 200, то проблем с сетью не было, поскольку браузер получил ответ от сервера. Вместо этого происходит то, что проверка CORS по какой-то причине не прошла; в результате браузер отказал вашему клиенту в доступе к ответу и выдал ошибку CORS.
Доступ к XMLHttpRequest по адресу 'http://localhost:8000/data/' от источника 'http://localhost:3000' был заблокирован политикой CORS: Значение заголовка 'Access-Control-Allow-Origin' в ответе не должно быть подстановочным символом '*', если режим мандатов запроса - 'include'. Режим полномочий запросов, инициированных XMLHttpRequest, контролируется атрибутом withCredentials.
.
Если вы получаете такое сообщение об ошибке, то это потому, что
- ваш клиентский код отправляет авторизованный запрос, но
- конфигурация CORS вашего сервера не разрешает такие запросы.
В вашем вопросе это не показано, но я подозреваю, что вы настроили свой клиент Axios на то, чтобы всегда отправлять запросы с учетными данными. Однако, установка CORS_ALLOW_ALL_ORIGINS
в конфигурации CORS без установки CORS_ALLOW_CREDENTIALS
results в следующем заголовке ответа,
Access-Control-Allow-Origin: *
и подстановочный знак несовместим с авторизованными запросами. Если вы хотите разрешить авторизованные запросы, вам необходимо также установить следующее в конфигурации CORS:
CORS_ALLOW_CREDENTIALS = True
В противном случае, проинструктируйте ваш клиент Axios не отправлять запросы, подтвержденные полномочиями.