Заголовок CORS по запросу OPTIONS?

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


50
1

Ответ:

Решено

Да, есть способ установить заголовок для ответов OPTIONS.

  1. Установите django-cors-headers (если еще не установлен):

Вы можете сделать это, запустив:

pip install django-cors-headers
  1. Настройте заголовки django-cors:

Затем добавьте 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.