Comment puis-je activer CORS sur mon Framework Django REST? la référence n'aide pas beaucoup, elle dit que je peux faire par un middleware, mais comment puis-je faire cela?
Comment puis-je activer CORS sur mon Framework Django REST? la référence n'aide pas beaucoup, elle dit que je peux faire par un middleware, mais comment puis-je faire cela?
Réponses:
Le lien que vous avez référencé dans votre question recommande d'utiliser django-cors-headers
, dont la documentation dit d'installer la bibliothèque
pip install django-cors-headers
puis ajoutez-le à vos applications installées:
INSTALLED_APPS = (
...
'corsheaders',
...
)
Vous devrez également ajouter une classe middleware pour écouter les réponses:
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)
Veuillez parcourir la section configuration de sa documentation, en portant une attention particulière aux différents CORS_ORIGIN_
paramètres. Vous devrez en définir certains en fonction de vos besoins.
Access-Control-Allow-Origin: *
je ne vois pas pourquoi charger un tout, je vais mettre une autre façon de le faire dans votre réponse afin que les deux méthodes puissent être disponibles. référence: [link (] enable-cors.org/server.html )
django-cors-headers
est beaucoup plus flexible que cela. Si vous préférez créer votre propre classe, soyez mon invité. Mais j'utiliserais cette bibliothèque.
pip install django-cors-headers
puis ajoutez-le à vos applications installées:
INSTALLED_APPS = (
...
'corsheaders',
...
)
Vous devrez également ajouter une classe middleware pour écouter les réponses:
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',
]
plus de détails: https://github.com/ottoyiu/django-cors-headers/#configuration
lire la documentation officielle peut résoudre presque tous les problèmes
CORS_ORIGIN_ALLOW_ALL = True
, mais CORS_ORIGIN_WHITELIST
est toujours défini? La documentation semble donner l'impression que cela n'est pas nécessaire et semble déroutant pour la réponse ici.
'corsheaders.middleware.CorsMiddleware',
qu'il faut plutôt être en haut de la liste, sinon la connexion peut être rejetée avant d'y accéder.
Vous pouvez le faire en utilisant un middleware personnalisé, même en sachant que la meilleure option consiste à utiliser l'approche testée du package django-cors-headers
. Cela dit, voici la solution:
créez la structure et les fichiers suivants:
- 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
ajouter à settings.py
la ligne marquée:
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
Au cas où quelqu'un reviendrait à cette question et déciderait d'écrire son propre middleware, ceci est un exemple de code pour le nouveau middleware de style de 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
Pour les versions Django> 1.10, selon la documentation , un MIDDLEWARE personnalisé peut être écrit en tant que fonction, disons dans le fichier: yourproject/middleware.py
(en tant que frère de 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
et enfin, ajoutez le chemin python de cette fonction (à la racine de votre projet) à la liste MIDDLEWARE de votre projet settings.py
:
MIDDLEWARE = [
.
.
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'yourproject.middleware.open_access_middleware'
]
Peasy facile!
open_access_middleware
.
Voici les étapes de travail sans avoir besoin de modules externes:
Étape 1: Créez un module dans votre application.
Par exemple, supposons que nous ayons une application appelée user_registration_app . Explorez user_registration_app et créez un nouveau fichier.
Appelons cela comme custom_cors_middleware.py
Collez la définition de classe ci-dessous:
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
Étape 2: enregistrer un middleware
Dans votre fichier settings.py, ajoutez cette ligne
'user_registration_app.custom_cors_middleware.CustomCorsMiddleware'
Par exemple:
MIDDLEWARE = [
'user_registration_app.custom_cors_middleware.CustomCorsMiddleware', # ADD THIS LINE BEFORE CommonMiddleware
...
'django.middleware.common.CommonMiddleware',
]
N'oubliez pas de remplacer user_registration_app par le nom de votre application sur laquelle vous avez créé votre module custom_cors_middleware.py.
Vous pouvez maintenant vérifier qu'il ajoutera les en-têtes de réponse requis à toutes les vues du projet!
Django = 2.2.12 django-cors-headers = 3.2.1 djangorestframework = 3.11.0
Suivre les instructions officielles ne fonctionne pas
Enfin, utilisez l'ancienne méthode pour le comprendre.
AJOUTER:
# 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',
),
}