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
]
Это помогло мне.