Как отправить заголовок «Access-Control-Allow-Origin», используя Django 3? - PullRequest
0 голосов
/ 13 июля 2020

Я новичок в программировании на стороне сервера, и я пытаюсь получить некоторую информацию из серверной части через интерфейс. Бэкэнд, как указано в шапке, записывается в Django. Интерфейс написан на React, если это важно.

На серверной части есть функция просмотра, которая возвращает только простую строку:

 HttpResponse("Some useful information.")

Эта строка доступна по адресу: "http://localhost: 8000 / информация / ". Проверил через браузер, действительно работает.

Итак, пытаюсь получить эту строку из внешнего интерфейса, используя библиотеку ax ios:

axios.get("http://localhost:8000/info/").then(res => {
    console.log(res.data);
})

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

Доступ к XMLHttpRequest по адресу 'http://localhost: 8000 / info /' from origin 'http://localhost: 3006' заблокирован политикой CORS: No 'Access-Control- Заголовок Allow-Origin 'присутствует на запрошенном ресурсе.

На стороне сервера ошибок нет. Возвращает код 200.

Насколько я понимаю, данные поступают на фронтенд, но браузер блокирует к нему доступ, потому что сервер должен дополнительно прикрепить заголовок 'Access-Control-Allow-Origin' .

Как мне отправить этот заголовок с сервера? Что-то настроить в settings.py или изменить функцию просмотра? А может есть другое решение?

Ответы [ 3 ]

1 голос
/ 13 июля 2020

Политика одинакового происхождения браузера не позволяет вашему скрипту считывать данные.

Для этого вам необходимо реализовать Совместное использование ресурсов между источниками .

Для этого в Django используйте пакет django -cors-headers .

0 голосов
/ 13 июля 2020

Ваш браузер не позволяет веб-приложению выполнять запросы к другому источнику (схеме, хосту или порту) в качестве меры безопасности. Поэтому, если ваш интерфейс обслуживается, например, localhost: 5000, вы не сможете получить доступ к своему экземпляру Django на localhost: 8000.

Если ваш сервер указывает заголовок Access-Control-Allow-Origin, ваш браузер примет такой запрос.

Django по умолчанию не добавляет этот заголовок, но вы можете написать для него промежуточное ПО или использовать django -cors-headers пакет, чтобы сделать это за вас.

Установите этот пакет, затем добавьте его в свой INSTALLED_APPS:

INSTALLED_APPS = [
    ...
    'corsheaders',
    ...
]

и добавьте его промежуточное ПО:

MIDDLEWARE = [  # Or MIDDLEWARE_CLASSES on Django < 1.10
    ...
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
]

Вы затем можно установить CORS_ORIGIN_ALLOW_ALL в своих настройках на True (не рекомендуется для производственных сред)

или установить CORS_ORIGIN_WHITELIST на ['http://localhost:8000']

0 голосов
/ 13 июля 2020

В Django вы можете установить заголовок, изменив ответ перед его возвратом.

response = HttpResponse("some useful information")
response["Access-Control-Allow-Origin"] = "http://localhost:3006"
return response

На практике, если вы хотите отправить заголовок CORS для нескольких представлений, я бы предложил используя django -cors-headers . У него есть промежуточное ПО, которое устанавливает заголовок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...