Як я можу ввімкнути 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',
),
}