Как решить проблему CORS моего Django API? - PullRequest
0 голосов
/ 02 ноября 2018

Я не могу решить проблему с CORS в моем Django API. Когда я звоню этому API, я получаю сообщение об ошибке:

Доступ к выборке в 'http://localhost:8000/' от источника 'http://localhost' заблокирован политикой CORS: Ответ на предварительный запрос не проходит проверку контроля доступа: нет Заголовок «Access-Control-Allow-Origin» присутствует в запрошенном ресурс. Если непрозрачный ответ удовлетворяет вашим потребностям, установите запрос режим 'no-cors' для извлечения ресурса с отключенным CORS.

Чтобы включить CORS, я сделал pip install django-cors-headers и добавил следующий код к settings.py:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'corsheaders',
]

MIDDLEWARE_CLASSES = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

CORS_ORIGIN_WHITELIST = [
    'localhost:80',
    'localhost:8000',
    '127.0.0.1:8000'
]

Я должен сказать, что я запускаю свой проект на Docker. Это docker-compose.yml:

version: '2'

services:
  django-docker:
    build:
      context: .
      dockerfile: Dockerfile.django
    container_name: my.django
    image: my-django
    ports:
      - 8000:8000

  webapp-docker:
    build:
      context: .
      dockerfile: Dockerfile.webapp
    container_name: my.webapp
    image: my-web
    ports:
      - 80:80

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Вам необходимо добавить corsheaders.middleware.CorsMiddleware промежуточное ПО к классам промежуточного ПО в settings.py:

MIDDLEWARE_CLASSES = (
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.BrokenLinkEmailsMiddleware',
    'django.middleware.common.CommonMiddleware',
    #...
)

У вас есть дубликат django.middleware.common.CommonMiddleware в ваших классах промежуточного программного обеспечения.

Затем можно включить CORS для всех доменов, добавив следующий параметр:

CORS_ORIGIN_ALLOW_ALL = True

Или включить CORS только для указанных доменов:

CORS_ORIGIN_ALLOW_ALL = False

CORS_ORIGIN_WHITELIST = (
    'http//:localhost:8000',
)
0 голосов
/ 02 ноября 2018

Попробуйте добавить это в ваших настройках:

from corsheaders.defaults import default_headers

CORS_ALLOW_HEADERS = default_headers + (
    'Access-Control-Allow-Origin',
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...