Wie kann ich CORS auf meinem Django REST Framework aktivieren? Die Referenz hilft nicht viel, es heißt, dass ich es mit einer Middleware machen kann, aber wie kann ich das machen?
Wie kann ich CORS im Django REST Framework aktivieren?
Julio Marins
Chris
Der Link, auf den Sie in Ihrer Frage verwiesen haben, empfiehlt die Verwendung django-cors-headers
wessen Dokumentation sagt, die Bibliothek zu installieren
python -m pip install django-cors-headers
und fügen Sie es dann zu Ihren installierten Apps hinzu:
INSTALLED_APPS = (
...
'corsheaders',
...
)
Sie müssen außerdem eine Middleware-Klasse hinzufügen, um Antworten abzuhören:
MIDDLEWARE = [
...,
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...,
]
und geben Sie Domänen für CORS an, z. B.:
CORS_ALLOWED_ORIGINS = [
'http://localhost:3030',
]
Bitte stöbern Sie den Konfigurationsabschnitt seiner Dokumentation unter besonderer Berücksichtigung der verschiedenen CORS_ORIGIN_
Einstellungen. Einige davon müssen Sie entsprechend Ihren Anforderungen festlegen.
-
Kennen Sie eine andere Möglichkeit, dies zu tun, ohne eine neue Abhängigkeit installieren zu müssen? Ich versuche jetzt, eine Middleware-Klasse zu erstellen
– Julio Marins
3. März 2016 um 0:50
-
@JulioMarins, warum sollten Sie Ihre eigene Version schreiben, wenn diese leicht verfügbar und einfach zu installieren ist, mit 12 Veröffentlichungen, 21 Mitwirkenden, über 800 Sternen und über 100 Forks?
– Chris
3. März 2016 um 0:52
-
Sie haben in der Tat Recht, aber für ein einfaches CORS ist nur ein Header erforderlich
Access-Control-Allow-Origin: *
Ich verstehe nicht, warum eine ganze Sache geladen werden soll. Ich werde in Ihrer Antwort eine andere Möglichkeit angeben, damit beide Methoden verfügbar sind. Referenz: [link(]enable-cors.org/server.html)– Julio Marins
3. März 2016 um 1:17
-
@JulioMarins, das wäre der Vorschlaghammer-Ansatz. Wenn Sie sich den von mir bereitgestellten Konfigurationslink ansehen, werden Sie das sehen
django-cors-headers
ist viel flexibler als das. Wenn Sie lieber Ihre eigene Klasse erstellen möchten, seien Sie mein Gast. Aber ich würde diese Bibliothek verwenden.– Chris
3. März 2016 um 1:20
-
@Chris Ich denke, du solltest hinzufügen CORS_ORIGIN_WHITELIST damit Sie den anrufenden Host auf die Whitelist setzen.
– Hakim
24. September 2017 um 21:32 Uhr
likaiguo.happy
python -m pip install django-cors-headers
und fügen Sie es dann zu Ihren installierten Apps hinzu:
INSTALLED_APPS = [
...
'corsheaders',
...
]
Sie müssen außerdem eine Middleware-Klasse hinzufügen, um Antworten abzuhören:
MIDDLEWARE = [
...,
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...,
]
CORS_ALLOW_ALL_ORIGINS = True # If this is used then `CORS_ALLOWED_ORIGINS` will not have any effect
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOWED_ORIGINS = [
'http://localhost:3030',
] # If this is used, then not need to use `CORS_ALLOW_ALL_ORIGINS = True`
CORS_ALLOWED_ORIGIN_REGEXES = [
'http://localhost:3030',
]
mehr Details: https://github.com/ottoyiu/django-cors-headers/#configuration
Das Lesen der offiziellen Dokumentation kann fast alle Probleme lösen
-
Das Hinzufügen der vier Zeilen, die Sie zur Antwort von @Chris hinzugefügt haben, war notwendig, damit dies für mich funktioniert.
– Matt
8. Juni 2018 um 5:13
-
Warum ist
CORS_ORIGIN_ALLOW_ALL = True
AberCORS_ORIGIN_WHITELIST
ist noch eingestellt? Die Dokumente Scheint den Anschein zu erwecken, dass dies nicht erforderlich ist und für die Antwort hier verwirrend zu sein scheint.– Phönix
12. Januar 2019 um 19:22 Uhr
-
CORS_ORIGIN_ALLOW_ALL Wenn True, wird die Whitelist nicht verwendet und alle Ursprünge werden akzeptiert.
– BjörnW
27. März 2019 um 20:42 Uhr
-
Denken Sie auch daran
'corsheaders.middleware.CorsMiddleware',
muss eher ganz oben auf der Liste stehen, sonst kann es sein, dass die Verbindung abgelehnt wird, bevor sie erreicht wird.– Sebastián Vansteenkiste
22. August 2019 um 14:34
-
CORS_ORIGIN_ALLOW_ALL = Stimmt, das hat funktioniert.
– Akhil S
5. Mai 2021 um 11:25
Julio Marins
Sie können dies tun, indem Sie eine benutzerdefinierte Middleware verwenden, obwohl Sie wissen, dass die beste Option darin besteht, den getesteten Ansatz des Pakets zu verwenden django-cors-headers
. Vor diesem Hintergrund ist hier die Lösung:
Erstellen Sie die folgende Struktur und Dateien:
— 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
ergänzen settings.py
die markierte Zeile:
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
)
-
Danke Julio! Ihr Middleware-Code sollte mit dem @masnun-Codebeispiel aktualisiert werden. Außerdem funktioniert der Import bei mir nicht, der Import aus . behebt das Problem:
from . import corsMiddleware
– Pavel Daynyak
10. Mai 2020 um 15:58
-
Was ist damit? ‘corsheaders.middleware.CorsMiddleware’, Muss nicht hinzugefügt werden?
– reza_khalafi
28. Januar um 16:45 Uhr
Falls jemand auf diese Frage zurückkommt und beschließt, seine eigene Middleware zu schreiben, ist dies ein Codebeispiel für Djangos Middleware im neuen Stil –
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
Dhruv Batheja
Für Django-Versionen > 1.10 laut Dokumentationeine benutzerdefinierte MIDDLEWARE kann als Funktion geschrieben werden, sagen wir in der Datei: yourproject/middleware.py
(als Geschwister von 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
und schließlich fügen Sie den Python-Pfad dieser Funktion (bezogen auf das Stammverzeichnis Ihres Projekts) zur MIDDLEWARE-Liste in Ihrem Projekt hinzu settings.py
:
MIDDLEWARE = [
.
.
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'yourproject.middleware.open_access_middleware'
]
Kinderleicht!
-
Der zuvor veröffentlichte Ansatz verwendet MIDDLEWARE_CLASSES und nicht MIDDLEWARE. Diese Technik funktioniert, daher war die Ablehnung unangebracht 🙂 @JulioMarins
– Dhruv Batheja
3. Dezember 2018 um 14:15 Uhr
-
Alter, die Lösung ist die gleiche. Sie streiten über die Implementierung in der Django-Version. Ihr Code weist außerdem eine falsche Einrückung auf
open_access_middleware
.– Julio Marins
3. Dezember 2018 um 18:12 Uhr
Nachfolgend finden Sie die Arbeitsschritte ohne die Notwendigkeit externer Module:
Schritt 1: Erstellen Sie ein Modul in Ihrer App.
Nehmen wir zum Beispiel an, wir haben eine App namens user_registration_app. Erkunden Sie user_registration_app und erstellen Sie eine neue Datei.
Nennen wir es als custom_cors_middleware.py
Fügen Sie die folgende Klassendefinition ein:
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
Schritt 2: Registrieren Sie eine Middleware
Fügen Sie in Ihrer Projektdatei „settings.py“ diese Zeile hinzu
‘user_registration_app.custom_cors_middleware.CustomCorsMiddleware’
Z.B:
MIDDLEWARE = [
'user_registration_app.custom_cors_middleware.CustomCorsMiddleware', # ADD THIS LINE BEFORE CommonMiddleware
...
'django.middleware.common.CommonMiddleware',
]
Denken Sie daran, es auszutauschen user_registration_app durch den Namen Ihrer App, in der Sie Ihr Modul „custom_cors_middleware.py“ erstellt haben.
Sie können jetzt überprüfen, ob allen Ansichten im Projekt die erforderlichen Antwortheader hinzugefügt werden!
-
Der zuvor veröffentlichte Ansatz verwendet MIDDLEWARE_CLASSES und nicht MIDDLEWARE. Diese Technik funktioniert, daher war die Ablehnung unangebracht 🙂 @JulioMarins
– Dhruv Batheja
3. Dezember 2018 um 14:15 Uhr
-
Alter, die Lösung ist die gleiche. Sie streiten über die Implementierung in der Django-Version. Ihr Code weist außerdem eine falsche Einrückung auf
open_access_middleware
.– Julio Marins
3. Dezember 2018 um 18:12 Uhr
Imran Zahoor
Aktualisiert 2021 Für alle, die die neueste Version von Django v3.xx haben: Die Schritte zum Zulassen von CORS von jedem Ursprung sind unten aufgeführt.
Schritt 1: Erforderliche Bibliothek installieren
pip install django-cors-headers
Schritt 2: Fügen Sie es dann an der richtigen Stelle in Ihrem hinzu INSTALLED_APPS In settings.py
– nach dem rest_framework
und vor Ihrer Bewerbung myapp
'rest_framework',
'corsheaders',
'myapp.apps.MyAppConfig',
Schritt 3: Erlauben Sie die Ursprünge für Ihre API (innen). settings.py
)
CORS_ORIGIN_WHITELIST = (
'http://localhost:3000', # for localhost (REACT Default)
'http://192.168.10.45:3000', # for network
)
-
Wie werden wir etwas Regex hinzufügen?
CORS_ORIGIN_WHITELIST
?– Rickster
19. Mai 2022 um 13:51 Uhr
-
@rickster du kannst eine andere Einstellung verwenden
CORS_ALLOWED_ORIGIN_REGEXES
– dakdad
20. März um 6:09
Django REST hat das Paket django-cors-headers,
settings..py
kann CORS_ORIGIN_WHITELIST haben, um Access-Control-Allow-Origin festzulegen. Siehe: stackoverflow.com/a/49520118/1548275– Jari Turkia
21. Februar 2022 um 19:22 Uhr