Как добавить разрешенные источники (CORS_ALLOWED_ORIGINS) в Django?

Как можно настроить значение CORS_ALLOWED_ORIGINS в Django таким образом, чтобы оно принимало запросы от всех поддоменов .example.com? Можно ли использовать какие-то шаблоны типа 'http://(*).example.com' для этого?
  • 31 января 2024 г. 18:19
Ответы на вопрос 1
Для управления Cross-Origin Resource Sharing (CORS) в Django, можно использовать пакет `django-cors-headers`, который позволяет добавить подходящие заголовки ответа HTTP для управления разрешенными источниками.

Первым делом установите `django-cors-headers`:

```sh
pip install django-cors-headers
```

После установки добавьте `'corsheaders'` в `INSTALLED_APPS` в вашем `settings.py`:

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

Затем добавьте `CorsMiddleware` в `MIDDLEWARE`:

```python
MIDDLEWARE = [
    ...
    'corsheaders.middleware.CorsMiddleware',
    ...
]
```

Теперь настройте `CORS_ALLOWED_ORIGINS` в `settings.py`. По умолчанию, `django-cors-headers` не поддерживает шаблоны поддоменов напрямую в `CORS_ALLOWED_ORIGINS`. Однако, можно использовать регулярные выражения в `CORS_ALLOWED_ORIGIN_REGEXES`.

Пример настройки для разрешения всех поддоменов `.example.com`:

```python
CORS_ALLOWED_ORIGIN_REGEXES = [
    r"^https?://(\w+\.)?example\.com$",
]
```

Эта регулярная выражение позволяет доступ для всех поддоменов `example.com`, включая домен `example.com` сам по себе. Однако, под "разрешение всех поддоменов" принято понимать n-уровневые поддомены, то есть также `sub.sub.example.com`, `sub2.sub.example.com` и т.д. Если вам нужно разрешить все n-уровневые поддомены, вам стоит модифицировать регулярное выражение следующим образом:

```python
CORS_ALLOWED_ORIGIN_REGEXES = [
    r"^https?://([a-zA-Z0-9-]+\.)*example\.com$",
]
```

Это регулярное выражение позволяет запросы через HTTP и HTTPS со всех поддоменов `example.com`, включая n-уровневые поддомены.

Если вы хотите разрешить только запросы через HTTPS, то просто удалите `http?` из регулярного выражения:

```python
CORS_ALLOWED_ORIGIN_REGEXES = [
    r"^https://([a-zA-Z0-9-]+\.)*example\.com$",
]
```

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