Django-cors-headers не работают

django-cors-headers не работают

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.gis',
    'corsheaders',
    'rest_framework',
    'world',
    'userManager',
    'markPost',
    'BasicServices',
)


MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    '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_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True

Все нормально, но не работает

здесь мои заголовки ответов

Cache-Control: max-age=0
Content-Type: text/html; charset=utf-8
Date: Tue, 20 Jan 2015 13:16:17 GMT
Expires: Tue, 20 Jan 2015 13:16:17 GMT
Last-Modified: Tue, 20 Jan 2015 13:16:17 GMT
Server: WSGIServer/0.1 Python/2.7.8
Set-Cookie: csrftoken=snXksqpljbCLW0eZ0EElFxKbiUkYIvK0; expires=Tue, 19-Jan-2016 13:16:17 GMT; Max-Age=31449600; Path=/
Vary: Cookie
X-Frame-Options: SAMEORIGIN

Ответ 1

В соответствии с кодом process_response от CorsMiddleware:

response[ACCESS_CONTROL_ALLOW_ORIGIN] = "*" if (
            settings.CORS_ORIGIN_ALLOW_ALL and
            not settings.CORS_ALLOW_CREDENTIALS) else origin

Вы должны установить такие настройки, как это:

# CORS Config
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = False

Ответ 2

Если вы тестируете это, вам необходимо обеспечить включение в запрос заголовка Origin.

например:.

$ http GET http://127.0.0.1:8000/todos/ Origin:http://www.someorigin.com
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Date: Sat, 14 Nov 2015 04:42:38 GMT
Server: WSGIServer/0.1 Python/2.7.10
Vary: Accept, Cookie
X-Frame-Options: SAMEORIGIN

Вы получите больше отзывов с предпродажным запросом CORS:

$ http OPTIONS http://127.0.0.1:8000/todos/ Origin:http://www.someorigin.com
HTTP/1.0 200 OK
Access-Control-Allow-Headers: x-requested-with, content-type, accept, origin, authorization, x-csrftoken, user-agent, accept-encoding
Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, OPTIONS
Access-Control-Allow-Origin: *
Access-Control-Max-Age: 86400
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Date: Sat, 14 Nov 2015 04:45:37 GMT
Server: WSGIServer/0.1 Python/2.7.10
Vary: Accept, Cookie
X-Frame-Options: SAMEORIGIN

Ответ 3

Я думаю, что corsheaders и clickjacking middlewares несовместимы. По крайней мере, я избавился от заголовка X-Frame-Options, когда я прокомментировал django.middleware.clickjacking.XFrameOptionsMiddleware.

Я установил только CORS_ORIGIN_ALLOW_ALL = True.

Ответ 4

У меня была такая же проблема, и все, казалось, было в правильном месте. Затем я понял, что запустил сервер перед добавлением 'corsheaders.middleware.CorsMiddleware', в MIDDLEWARE_CLASSES. После внесения исправлений все равно не работало. Попробовав кучу вещей, я открыл его в другом браузере, и он заработал. Так получилось, что мне просто нужно очистить кеш браузера.

Ответ 5

Не забудьте добавить

'corsheaders.middleware.CorsMiddleware',

в верхней части переменной MIDDLEWARE:

Смотрите документы:

CorsMiddleware следует размещать как можно выше, особенно перед любое промежуточное программное обеспечение, которое может генерировать ответы, такие как Django's CommonMiddleware или Whitenoise WhiteNoiseMiddleware. Если это не так до этого он не сможет добавить заголовки CORS к этим ответы.

Ответ 6

С Django 2 MIDDLEWARE_CLASSES изменяется на MIDDLEWARE. В этом случае, если у вас есть Django 2, убедитесь, что MIDDLWARE так, как должно быть, чтобы MIDDLEWARES выполнялись.

Ответ 7

Окончательное решение - отправить ответ с разрешенными заголовками CORS.

response["Access-Control-Allow-Origin"] = "*"
response['Content-Type'] = "application/json; charset=utf-8"
response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Methods"] = "GET, OPTIONS"
response["Access-Control-Max-Age"] = "1000"
response["Access-Control-Allow-Headers"] = "X-Requested-With, Content-Type, My-Token"

Ответ 8

Каким-то образом django-cors-headers не будет работать для меня с Django 2, несмотря на выполнение всех шагов. Проверка перед полетом повлекла бы повторную ошибку 405.

В итоге я написал небольшое промежуточное ПО:

from django import http


class CorsMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        if (request.method == "OPTIONS"  and "HTTP_ACCESS_CONTROL_REQUEST_METHOD" in request.META):
            response = http.HttpResponse()
            response["Content-Length"] = "0"
            response["Access-Control-Max-Age"] = 86400
        response["Access-Control-Allow-Origin"] = "*"
        response["Access-Control-Allow-Methods"] = "DELETE, GET, OPTIONS, PATCH, POST, PUT"
        response["Access-Control-Allow-Headers"] = "accept, accept-encoding, authorization, content-type, dnt, origin, user-agent, x-csrftoken, x-requested-with"
        return response

Затем добавил это промежуточное ПО в мой settings.py:

MIDDLEWARE = [
    'apps.core.middleware.CorsMiddleware',
     ... others below it
]

Это помогло мне.