Django REST Framework: Ошибка "Нет заголовка 'Access-Control-Allow-Origin'" в Chrome, работает в Firefox
Я изучил и прочитал довольно много сообщений на StackOverflow по аналогичной проблеме, но ни одно из них не помогло мне решить свою ситуацию.
Моя проблема заключается в том, что я получаю ошибку "...Отсутствует заголовок 'Access-Control-Allow-Origin' на запрашиваемом ресурсе..." в консоли.
Вот что я использую:
Chrome версия 57.0.2987.133
Firefox версия 52.0.2
Python 2.7
Django 1.11a1
AngularJS
Я использую MAMP для обслуживания своего фронтенда на Angular и сервер Django для бэкенда.
В своем файле настроек Django я добавил middleware для CORS и попробовал как подход с белым списком, так и настройку, позволяющую всем обращаться к ресурсам:
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
В Google Chrome я все равно получаю эту ошибку:
localhost/:1 XMLHttpRequest не может загрузить {url моего конечного точки}. Перенаправление с {url моего конечного точки} на {url моего конечного точки с } было заблокировано политикой CORS: заголовок 'Access-Control-Allow-Origin' отсутствует на запрашиваемом ресурсе. Таким образом, источник {запрашивающий url} не имеет доступа.
В Firefox всё работает корректно, и я не могу понять, почему это не работает в Google Chrome. Я не пробовал другие браузеры. Буду признателен за любую помощь, спасибо.
5 ответ(ов)
Чтобы установить пакет django-cors-headers
, выполните команду:
pip install django-cors-headers
Затем добавьте его в ваш список установленных приложений:
INSTALLED_APPS = [
...
'corsheaders',
...
]
После этого необходимо внести изменения в ваш список MIDDLEWARE
. Не забудьте добавить его первым в списке:
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
]
Если вы хотите разрешить доступ для всех источников, добавьте следующую настройку до списка установленных приложений:
CORS_ORIGIN_ALLOW_ALL = True
Или вы можете создать список разрешённых источников:
CORS_ORIGIN_WHITELIST = [
'http://google.com',
'http://hostname.example.com',
'http://localhost:8000',
'http://127.0.0.1:9000'
]
Эти настройки помогут вам настроить CORS в вашем Django приложении.
Сначала проверьте свой URL запроса. У меня возникла такая проблема при использовании vue-resource. В моем случае ошибка была связана с отсутствием '/' в конце URL.
Убедитесь, что вы используете 127.0.0.1
, а не localhost
, потому что при использовании localhost
браузер может попытаться найти IPv6-адрес... Альтернативно, вы можете настроить localhost
явно на 127.0.0.1
в файле /etc/hosts
.
Возможно, вам стоит обратить внимание на порядок вызова ваших промежуточных слоев (middleware). Если они не расположены в правильной последовательности, это может привести к указанной ошибке. Похоже, что ваш 'django.middleware.security.SecurityMiddleware'
должен находиться ниже 'corsheaders.middleware.CorsMiddleware'
.
Кроме того, вам, возможно, потребуется добавить в ваш код строку CORS_ALLOW_CREDENTIALS = True
.
Надеюсь, это поможет!
Чтобы настроить CORS (Cross-Origin Resource Sharing) в вашем проекте Django, вам необходимо выполнить следующие шаги в файле settings.py
:
MIDDLEWARE = [
# ...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
# ...
]
INSTALLED_APPS = [
'corsheaders',
# ...
]
# Чтобы разрешить все домены, установите CORS_ORIGIN_ALLOW_ALL в True
CORS_ORIGIN_ALLOW_ALL = True # это разрешает запросы с любых доменов
# Или, чтобы разрешить конкретные домены, используйте CORS_ORIGIN_WHITELIST
CORS_ORIGIN_WHITELIST = (
'http://example.com',
'http://127.0.0.1:8000',
'http://localhost:8000',
)
Кроме того, в вашем фронтенд-запросе необходимо добавить соответствующие заголовки:
var get_request = $.ajax({
type: 'GET',
"headers": {
"accept": "application/json",
"Access-Control-Allow-Origin": "*"
},
url: 'http://example.com',
});
Если проблема не решена, убедитесь, что CORS включен на сервере, с которого вы отправляете запросы (например, http://example.com
).
Django Rest Framework: порядок вложенных сериализаторов
Django Rest Framework - Получение поля связанной модели в сериализаторе
Как отобразить все поля модели с помощью ModelSerializer?
PIL / JPEG библиотека: "декодировщик JPEG недоступен"
"_set" в объекте queryset в Django