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