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.