Jak mogę włączyć CORS w moim Django REST Framework? odniesienia nie pomaga, to mówi, że mogę zrobić przez middleware, ale w jaki sposób można to zrobić?
Jak mogę włączyć CORS w moim Django REST Framework? odniesienia nie pomaga, to mówi, że mogę zrobić przez middleware, ale w jaki sposób można to zrobić?
Odpowiedzi:
Odnośnik, o którym wspomniałeś w swoim pytaniu, zaleca użycie django-cors-headers
, którego dokumentacja mówi o zainstalowaniu biblioteki
pip install django-cors-headers
a następnie dodaj go do zainstalowanych aplikacji:
INSTALLED_APPS = (
...
'corsheaders',
...
)
Będziesz także musiał dodać klasę oprogramowania pośredniego, aby nasłuchiwać odpowiedzi:
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)
Przejrzyj sekcję dotyczącą konfiguracji w jego dokumentacji, zwracając szczególną uwagę na różne CORS_ORIGIN_
ustawienia. Musisz ustawić niektóre z nich w zależności od swoich potrzeb.
Access-Control-Allow-Origin: *
, nie widzę powodu, aby ładować całość, przedstawię inny sposób zrobienia tego w twojej odpowiedzi, aby obie metody były dostępne. źródło : [link (] enable-cors.org/server.html )
django-cors-headers
jest on znacznie bardziej elastyczny. Jeśli wolisz stworzyć własną klasę, bądź moim gościem. Ale używałbym tej biblioteki.
pip install django-cors-headers
a następnie dodaj go do zainstalowanych aplikacji:
INSTALLED_APPS = (
...
'corsheaders',
...
)
Będziesz także musiał dodać klasę oprogramowania pośredniego, aby nasłuchiwać odpowiedzi:
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',
]
więcej szczegółów: https://github.com/ottoyiu/django-cors-headers/#configuration
Przeczytaj oficjalną dokumentację może rozwiązać prawie każdy problem
'corsheaders.middleware.CorsMiddleware',
że należy raczej znajdować się na górze listy, w przeciwnym razie połączenie może zostać odrzucone przed uzyskaniem do niego dostępu.
Możesz to zrobić, korzystając z niestandardowego oprogramowania pośredniego, nawet wiedząc, że najlepszą opcją jest użycie przetestowanego podejścia pakietu django-cors-headers
. Mając to na uwadze, oto rozwiązanie:
utwórz następującą strukturę i pliki:
- 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
dodaj do settings.py
zaznaczonej linii:
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
Na wypadek, gdyby ktoś wracał do tego pytania i decydował się napisać własne oprogramowanie pośredniczące, jest to przykładowy kod dla oprogramowania pośredniczącego nowego stylu 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
Dla wersji Django> 1.10, zgodnie z dokumentacją , niestandardowe OPROGRAMOWANIE ŚRODKOWE może zostać zapisane jako funkcja, powiedzmy w pliku: yourproject/middleware.py
(jako rodzeństwo 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
i na koniec dodaj ścieżkę Pythona do tej funkcji (wrt root twojego projektu) do listy MIDDLEWARE w twoim projekcie settings.py
:
MIDDLEWARE = [
.
.
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'yourproject.middleware.open_access_middleware'
]
Bułka z masłem!
open_access_middleware
.
Poniżej znajdują się kroki robocze bez konieczności stosowania zewnętrznych modułów:
Krok 1: Utwórz moduł w swojej aplikacji.
Załóżmy na przykład, że mamy aplikację o nazwie user_registration_app . Przeglądaj user_registration_app i utwórz nowy plik.
Nazwijmy to custom_cors_middleware.py
Wklej poniższą definicję klasy:
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
Krok 2: Zarejestruj oprogramowanie pośredniczące
W pliku settings.py projektów dodaj tę linię
„user_registration_app.custom_cors_middleware.CustomCorsMiddleware”
Na przykład:
MIDDLEWARE = [
'user_registration_app.custom_cors_middleware.CustomCorsMiddleware', # ADD THIS LINE BEFORE CommonMiddleware
...
'django.middleware.common.CommonMiddleware',
]
Pamiętaj, aby zastąpić user_registration_app nazwą swojej aplikacji, w której utworzyłeś moduł custom_cors_middleware.py.
Możesz teraz sprawdzić, czy doda wymagane nagłówki odpowiedzi do wszystkich widoków w projekcie!
Django = 2.2.12 django-cors-headers = 3.2.1 djangorestframework = 3.11.0
Postępuj zgodnie z oficjalną instrukcją, która nie działa
Wreszcie użyj starego sposobu, aby to rozgryźć.
DODAJ:
# 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',
),
}