Come posso abilitare CORS su Django REST Framework


Risposte:


147

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.


2
conosci un altro modo per farlo, senza la necessità di installare una nuova dipendenza? Sto cercando di creare una classe di middleware ora
Julio Marins

5
@ JulioMarins, perché dovresti scrivere la tua versione quando è prontamente disponibile e facilmente installabile, con 12 versioni, 21 collaboratori, oltre 800 stelle e oltre 100 fork?
Chris

2
Hai davvero ragione, ma poiché l'unica necessità di un semplice CORS è un'intestazione 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 )
Julio Marins

2
@ JulioMarins, quello sarebbe l'approccio della mazza. Se guardi il collegamento di configurazione che ti ho fornito vedrai che django-cors-headersè molto più flessibile di così. Se preferisci creare la tua classe, sii mio ospite. Ma userei quella libreria.
Chris

4
@ Chris Penso che dovresti aggiungere CORS_ORIGIN_WHITELIST in modo da inserire nella whitelist l'host chiamante.
Hakim

58
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


4
L'aggiunta delle quattro righe che hai aggiunto alla risposta di @ Chris era necessaria affinché funzionasse per me.
Matt D

5
Perché è 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.
phoenix

CORS_ORIGIN_ALLOW_ALL Se True, la whitelist non verrà utilizzata e verranno accettate tutte le origini.
BjornW

2
Inoltre, tieni presente che 'corsheaders.middleware.CorsMiddleware',deve essere piuttosto in cima alla lista, altrimenti la connessione potrebbe essere rifiutata prima di arrivarci.
Sebastián Vansteenkiste

14

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.pyriga 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
)

Grazie Julio! Il codice middleware dovrebbe essere aggiornato con l'esempio di codice @masnun. Inoltre, l'importazione non funziona per me, importando da. risolve il problema: from . import corsMiddleware
Pavel Daynyak

13

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

7

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!


L'approccio pubblicato prima utilizza MIDDLEWARE_CLASSES e non MIDDLEWARE. Questa tecnica funziona in modo che il downvote non fosse richiesto :) @JulioMarins
Dhruv Batheja

1
amico, la soluzione è la stessa. Stai discutendo sull'implementazione sulla versione Django. Il tuo codice ha anche un rientro sbagliato open_access_middleware.
Julio Marins

4

Beh, non conosco ragazzi ma:

usando qui python 3.6 e django 2.2

La ridenominazione di MIDDLEWARE_CLASSES in MIDDLEWARE in settings.py ha funzionato.


3

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!


0

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',
    ),
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.