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 полностью отсутствует, если совпадение не найдено. Это означает, что отсутствие заголовка не является верным признаком полной неисправности промежуточного программного обеспечения, но, возможно, просто неправильной конфигурации.