Django Localhost CORS не работает
у меня есть локальная настройка Django следующим образом
Django Rest Framework
:localhost:8000
AngularJS frontend
:local apache running on http://localservername
я установил django-cors-headers
и в моем settings.py
, Я настроил свой
CORS_ORIGIN_WHITELIST = (
'http://localhost',
'localservername',
'http://localservername',
'127.0.0.1'
)
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',
)
тем не менее, я получаю No 'Access-Control-Allow-Origin' header is present on the requested resource.
ошибка всякий раз, когда я нажимаю любой API, который обслуживается из Rest Framework
. Если я установлю CORS_ORIGIN_ALLOW_ALL = True
, то API работает правильно, но это очень небезопасно для моих данных на стороне сервера.
что мне нужно изменить, чтобы исправить это?
2 ответов
по состоянию на http://www.w3.org/Security/wiki/Same_Origin_Policy запросы должны быть из того же порта, схема и хост считается же происхождения. Здесь один из ваших серверов находится в порту 80, а другой-в 8080.
источник определяется схемой, хостом и портом URL-адреса. Обычно говоря, документы, извлеченные из различных источников, изолированы от друг с другом. Например, если документ получен из http://example.com/doc.html пытается получить доступ к DOM документа извлечено из https://example.com/target.html, Агент пользователя будет запретить доступ, поскольку источник первого документа, (http, example.com, 80), не соответствует происхождению второго документа (https, example.com, 443).
у меня была та же проблема. При просмотре django-cors-headers
-код обнаружил, что моя ошибка была следующей:
в то время как полный заголовок CORS выглядит так (схема уведомления и имя хоста):
Access-Control-Allow-Origin: https://example.com
The CORS_ORIGIN_WHITELIST
настройка хочет его в формате, который сравнивает с urlparse.netloc
(docs) из Origin
-заголовок, который является только узел (возможно, порт)
def origin_found_in_white_lists(self, origin, url):
return (
url.netloc in conf.CORS_ORIGIN_WHITELIST or
(origin == 'null' and origin in conf.CORS_ORIGIN_WHITELIST) or
self.regex_domain_match(origin)
)
в то время как RegEx-whitelist сравнивает его с полным Origin
-заголовок.
таким образом, правильная настройка (как пример в руководстве по установке правильно указано, но неправильно описано) будет:
CORS_ORIGIN_WHITELIST = (
'example.com',
)
что может быть проблемой, если вы не хотите, чтобы ваш API разговаривал с небезопасной http-версией веб-сайта. В этом случае используйте регулярное выражение.
Также обратите внимание: во время устранения неполадок я обнаружил, что заголовок CORS полностью отсутствует, если совпадение не найдено. Это означает, что отсутствие заголовка не является верным признаком полной неисправности промежуточного программного обеспечения, но, возможно, просто неправильной конфигурации.