Come posso abilitare CORS sul mio Django REST Framework? il riferimento non aiuta molto, dice che posso farlo da un middleware, ma come posso farlo?
Come posso abilitare CORS sul mio Django REST Framework? il riferimento non aiuta molto, dice che posso farlo da un middleware, ma come posso farlo?
Risposte:
Il collegamento a cui hai fatto riferimento nella tua domanda consiglia di utilizzare django-cors-headers
, la cui documentazione dice di installare la libreria
pip install django-cors-headers
e quindi aggiungilo alle tue app installate:
INSTALLED_APPS = (
...
'corsheaders',
...
)
Dovrai anche aggiungere una classe middleware per ascoltare le risposte:
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)
Si prega di sfogliare la sezione di configurazione della sua documentazione, prestando particolare attenzione alle varie CORS_ORIGIN_
impostazioni. Dovrai impostare alcuni di quelli in base alle tue esigenze.
Access-Control-Allow-Origin: *
, non vedo perché caricare un'intera cosa, metterò un altro modo per farlo nella tua risposta in modo che entrambi i metodi possano essere disponibili. riferimento: [link (] enable-cors.org/server.html )
django-cors-headers
è molto più flessibile di così. Se preferisci creare la tua classe, sii mio ospite. Ma userei quella libreria.
pip install django-cors-headers
e quindi aggiungilo alle tue app installate:
INSTALLED_APPS = (
...
'corsheaders',
...
)
Dovrai anche aggiungere una classe middleware per ascoltare le risposte:
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',
]
maggiori dettagli: https://github.com/ottoyiu/django-cors-headers/#configuration
leggere la documentazione ufficiale può risolvere quasi tutti i problemi
CORS_ORIGIN_ALLOW_ALL = True
, ma CORS_ORIGIN_WHITELIST
è ancora impostato? I documenti sembrano far sembrare che questo non sia richiesto e sembra creare confusione per la risposta qui.
'corsheaders.middleware.CorsMiddleware',
deve essere piuttosto in cima alla lista, altrimenti la connessione potrebbe essere rifiutata prima di arrivarci.
Puoi farlo utilizzando un middleware personalizzato, anche se sapendo che l'opzione migliore è utilizzare l'approccio testato del pacchetto django-cors-headers
. Detto questo, ecco la soluzione:
creare la seguente struttura e file:
- 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
aggiungi alla settings.py
riga contrassegnata:
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
Nel caso qualcuno stia tornando a questa domanda e decida di scrivere il proprio middleware, questo è un esempio di codice per il nuovo middleware di 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
Per le versioni di Django> 1.10, secondo la documentazione , un MIDDLEWARE personalizzato può essere scritto come funzione, diciamo nel file: yourproject/middleware.py
(come fratello di 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
e infine, aggiungi il percorso python di questa funzione (rispetto alla radice del tuo progetto) all'elenco MIDDLEWARE nel tuo progetto settings.py
:
MIDDLEWARE = [
.
.
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'yourproject.middleware.open_access_middleware'
]
Vai tranquillo!
open_access_middleware
.
Di seguito sono riportate le fasi di lavoro senza la necessità di alcun modulo esterno:
Passaggio 1: crea un modulo nella tua app.
Ad esempio, supponiamo di avere un'app chiamata user_registration_app . Esplora user_registration_app e crea un nuovo file.
Chiamiamolo custom_cors_middleware.py
Incolla la seguente definizione di classe:
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
Passaggio 2: registrare un middleware
Nel file settings.py del tuo progetto, aggiungi questa riga
"user_registration_app.custom_cors_middleware.CustomCorsMiddleware"
Per esempio:
MIDDLEWARE = [
'user_registration_app.custom_cors_middleware.CustomCorsMiddleware', # ADD THIS LINE BEFORE CommonMiddleware
...
'django.middleware.common.CommonMiddleware',
]
Ricordati di sostituire user_registration_app con il nome della tua app in cui hai creato il tuo modulo custom_cors_middleware.py.
Ora puoi verificare che aggiungerà le intestazioni di risposta richieste a tutte le viste nel progetto!
Django = 2.2.12 django-cors-headers = 3.2.1 djangorestframework = 3.11.0
Seguire le istruzioni ufficiali non funziona
Infine usa il vecchio modo per capirlo.
INSERISCI:
# 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',
),
}