Белый список заголовков Django CORS не работает - PullRequest
0 голосов
/ 08 ноября 2019

Я работаю над существующей кодовой базой, которая состоит из бэкэнда Django и внешнего интерфейса ReactJS. Все настроено так, что я запускаю бэкэнд на localhost:8001, а внешний интерфейс на localhost:3000.

Поскольку в браузере возникли ошибки CORS, я добавил в Django django-cors-headers . Однако, когда я добавляю CORS_ORIGIN_ALLOW_ALL = True, я получаю сообщение об ошибке:

Запрос перекрестного источника заблокирован: та же политика происхождения запрещает чтение удаленного ресурса в 'http://127.0.0.1:8001/devices/’. (причина: учетные данныене поддерживается, если заголовок CORS 'Access-Control-Allow-Origin' равен '*').

Итак, я добавил следующие параметры:

CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = (
    'http//:127.0.0.1:3000',
    'http//:127.0.0.1:8001',
)

Но чем япоявляется сообщение об ошибке

Заголовок CORS 'Access-Control-Allow-Origin' отсутствует

Почему белый список не работает? Я что-то здесь не так делаю?

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Установите любое расширение браузера для любого источника, когда вы запускаете код переднего плана локально, это будет полезно.

и измените URL белого списка, как показано ниже (//: должно быть: //):

CORS_ORIGIN_WHITELIST = (
'http://127.0.0.1:3000',
'http://127.0.0.1:8001',
)
0 голосов
/ 08 ноября 2019

Если у вас есть CORS_ORIGIN_ALLOW_ALL = True, это установит Access-Control-Allow-Origin: *, и, как показывает ошибка, при разрешении всех доменов для перекрестных запросов, вы не можете передать флаг credentials с запросом. Поэтому, если вы хотите сохранить заголовок как Access-Control-Allow-Origin: *, проще всего было бы не использовать флаг credentials при отправке запроса CORS из внешнего интерфейса.

Если вы хотите разрешить только определенные домены(что предпочтительно), вам нужно сначала найти действительные домены. Помните, что эти домены являются исходными доменами, откуда приходят запросы в Django. Вы можете найти их, посмотрев на request.META.REMOTE_HOST. request.META - это среда, видимая и передаваемая WSGI, и если между ними есть несколько прокси, это даст вам последний хост в цепочке прокси.

Если у вас есть веб-сервер, который взаимодействует с WSGI, например nginx, он передаст REMOTE_HOST вашему приложению Django или любому промежуточному серверу WSGI, который у вас есть (например, uWSGI / gunicorn), и они, в свою очередь, передадут это вашему приложению.


Кроме того, в ваших настройках URL-адреса в CORS_ORIGIN_WHITELIST имеют неправильный формат;разделитель между схемой и netloc равен ://, а не //:, например:

http://127.0.0.1:3000
...