Как я могу включить CORS в моей Django REST Framework? ссылка не помогает, он говорит , что я могу сделать с помощью промежуточного слоя, но как я могу это сделать?
Как я могу включить CORS в моей Django REST Framework? ссылка не помогает, он говорит , что я могу сделать с помощью промежуточного слоя, но как я могу это сделать?
Ответы:
Ссылка, на которую вы ссылаетесь в своем вопросе, рекомендует использовать django-cors-headers
, документация которой говорит об установке библиотеки
pip install django-cors-headers
а затем добавьте его в установленные приложения:
INSTALLED_APPS = (
...
'corsheaders',
...
)
Вам также потребуется добавить класс промежуточного программного обеспечения для прослушивания ответов:
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)
Просмотрите раздел конфигурации документации, обращая особое внимание на различные CORS_ORIGIN_
настройки. Вам нужно будет установить некоторые из них в зависимости от ваших потребностей.
Access-Control-Allow-Origin: *
я не понимаю, зачем загружать все это, я предложу другой способ сделать это в вашем ответе, чтобы оба метода были доступны. ссылка: [ссылка (] enable-cors.org/server.html )
django-cors-headers
она намного более гибкая. Если вы предпочитаете создать свой собственный класс, будь моим гостем. Но я бы использовал эту библиотеку.
pip install django-cors-headers
а затем добавьте его в установленные приложения:
INSTALLED_APPS = (
...
'corsheaders',
...
)
Вам также потребуется добавить класс промежуточного программного обеспечения для прослушивания ответов:
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)
CORS_ORIGIN_ALLOW_ALL = True # If this is used then `CORS_ORIGIN_WHITELIST` will not have any effect
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = [
'http://localhost:3030',
] # If this is used, then not need to use `CORS_ORIGIN_ALLOW_ALL = True`
CORS_ORIGIN_REGEX_WHITELIST = [
'http://localhost:3030',
]
подробнее: https://github.com/ottoyiu/django-cors-headers/#configuration
чтение официальной документации может решить почти все проблемы
CORS_ORIGIN_ALLOW_ALL = True
, но CORS_ORIGIN_WHITELIST
все равно установлено? Документы, похоже, создают впечатление, что это не требуется и, похоже, сбивает с толку ответ здесь.
'corsheaders.middleware.CorsMiddleware',
должен находиться в верхней части списка, иначе соединение может быть отклонено до того, как оно будет достигнуто.
Вы можете сделать это, используя настраиваемое промежуточное программное обеспечение, даже зная, что лучший вариант - использовать протестированный подход пакета django-cors-headers
. С учетом сказанного, вот решение:
создать следующую структуру и файлы:
- myapp/middleware/__init__.py
from corsMiddleware import corsMiddleware
- myapp/middleware/corsMiddleware.py
class corsMiddleware(object):
def process_response(self, req, resp):
resp["Access-Control-Allow-Origin"] = "*"
return resp
добавить settings.py
в отмеченную строку:
MIDDLEWARE_CLASSES = (
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
# Now we add here our custom middleware
'app_name.middleware.corsMiddleware' <---- this line
)
from . import corsMiddleware
Если кто-то возвращается к этому вопросу и решает написать свое собственное промежуточное программное обеспечение, это образец кода для промежуточного программного обеспечения нового стиля Django -
class CORSMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
response["Access-Control-Allow-Origin"] = "*"
return response
Для версий Django> 1.10, согласно документации , пользовательское MIDDLEWARE может быть записано как функция, скажем, в файле: yourproject/middleware.py
(как родственный элемент settings.py
):
def open_access_middleware(get_response):
def middleware(request):
response = get_response(request)
response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Headers"] = "*"
return response
return middleware
и, наконец, добавьте путь Python к этой функции (относительно корня вашего проекта) в список MIDDLEWARE вашего проекта settings.py
:
MIDDLEWARE = [
.
.
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'yourproject.middleware.open_access_middleware'
]
Очень просто!
open_access_middleware
.
Ниже приведены этапы работы без внешних модулей:
Шаг 1. Создайте модуль в своем приложении.
Например, предположим, что у нас есть приложение с именем user_registration_app . Изучите user_registration_app и создайте новый файл.
Назовем это custom_cors_middleware.py
Вставьте определение класса ниже:
class CustomCorsMiddleware:
def __init__(self, get_response):
self.get_response = get_response
# One-time configuration and initialization.
def __call__(self, request):
# Code to be executed for each request before
# the view (and later middleware) are called.
response = self.get_response(request)
response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Headers"] = "*"
# Code to be executed for each request/response after
# the view is called.
return response
Шаг 2. Зарегистрируйте промежуточное ПО
В файле settings.py вашего проекта добавьте эту строку
'user_registration_app.custom_cors_middleware.CustomCorsMiddleware'
Например:
MIDDLEWARE = [
'user_registration_app.custom_cors_middleware.CustomCorsMiddleware', # ADD THIS LINE BEFORE CommonMiddleware
...
'django.middleware.common.CommonMiddleware',
]
Не забудьте заменить user_registration_app именем вашего приложения, в котором вы создали модуль custom_cors_middleware.py.
Теперь вы можете убедиться, что он добавит необходимые заголовки ответов во все представления в проекте!
Django = 2.2.12 django-cors-headers = 3.2.1 djangorestframework = 3.11.0
Следовать официальной инструкции не работает
Наконец, используйте старый способ, чтобы понять это.
ДОБАВИТЬ:
# proj/middlewares.py
from rest_framework.authentication import SessionAuthentication
class CsrfExemptSessionAuthentication(SessionAuthentication):
def enforce_csrf(self, request):
return # To not perform the csrf check previously happening
#proj/settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'proj.middlewares.CsrfExemptSessionAuthentication',
),
}