0

Django REST Framework: Ошибка "Нет заголовка 'Access-Control-Allow-Origin'" в Chrome, работает в Firefox

14

Я изучил и прочитал довольно много сообщений на 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 ответ(ов)

0

Чтобы установить пакет 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 приложении.

0

Сначала проверьте свой URL запроса. У меня возникла такая проблема при использовании vue-resource. В моем случае ошибка была связана с отсутствием '/' в конце URL.

0

Убедитесь, что вы используете 127.0.0.1, а не localhost, потому что при использовании localhost браузер может попытаться найти IPv6-адрес... Альтернативно, вы можете настроить localhost явно на 127.0.0.1 в файле /etc/hosts.

0

Возможно, вам стоит обратить внимание на порядок вызова ваших промежуточных слоев (middleware). Если они не расположены в правильной последовательности, это может привести к указанной ошибке. Похоже, что ваш 'django.middleware.security.SecurityMiddleware' должен находиться ниже 'corsheaders.middleware.CorsMiddleware'.

Кроме того, вам, возможно, потребуется добавить в ваш код строку CORS_ALLOW_CREDENTIALS = True.

Надеюсь, это поможет!

0

Чтобы настроить 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).

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь