Я пытаюсь настроить веб-приложение с помощью Angular и Django, но у меня проблема с заголовками CORS.
Насколько я понимаю, чтобы включить в запрос данные cookie из внешнего интерфейса (например, токен csrf и идентификатор сеанса), мне нужно установить для параметра withCredentials значение true в запросе. Итак, GET-запрос выглядит как this.http.get(this.url, { withCredentials: true });
. Затем браузер говорит
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at xxx. (Reason: expected ‘true’ in CORS header ‘Access-Control-Allow-Credentials’).
Я могу исправить это для запроса GET, добавив заголовок к ответу с помощью response["Access-Control-Allow-Credentials"] = "true"
, но проблема возникает, когда я делаю запрос POST. В этом случае интерфейс автоматически отправляет запрос OPTIONS перед POST, который, насколько я понимаю, является стандартным и используется для проверки того, что серверная часть позволяет публиковать. Однако я не могу установить заголовок CORS для ответа на запрос OPTIONS, поэтому я фактически не могу отправить запрос POST.
Есть ли способ установить заголовок для ответов OPTIONS или я вообще что-то делаю не так?
🤔 А знаете ли вы, что...
Django имеет мощную систему миграций, которая автоматически обновляет схему базы данных при изменении моделей.
Да, есть способ установить заголовок для ответов OPTIONS.
Вы можете сделать это, запустив:
pip install django-cors-headers
Затем добавьте corsheaders к установленным приложениям и промежуточному ПО в файле settings.py
:
INSTALLED_APPS = [
...
'corsheaders',
...
]
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
]
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
Итак, если вы выполните описанные выше шаги, ваш бэкэнд Django будет правильно реагировать на запросы OPTIONS и устанавливать правильные заголовки CORS, поэтому ваше угловое приложение сможет выполнять запросы POST, не сталкиваясь с проблемами CORS.