web-dev-qa-db-fra.com

Comment puis-je activer CORS sur Django REST Cadre

Comment puis-je activer CORS sur mon framework Django REST? la référence n'aide pas beaucoup, il dit que je peux le faire avec un middleware, mais comment puis-je le faire?

39
Julio Marins

Le lien que vous avez référencé dans votre question recommande d'utiliser Django-cors-headers , dont 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 de middleware pour écouter les réponses:

MIDDLEWARE_CLASSES = (
    ...
    'corsheaders.middleware.CorsMiddleware',
    'Django.middleware.common.CommonMiddleware',
    ...
)

Vous voudrez peut-être aussi parcourir la section de configuration de sa documentation, en prêtant une attention particulière aux divers paramètres CORS_Origin_.

65
Chris
pip install Django-cors-headers

puis ajoutez-le à vos applications installées:

INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
)

Vous devrez également ajouter une classe de middleware pour écouter les réponses:

MIDDLEWARE_CLASSES = (
    ...
    'corsheaders.middleware.CorsMiddleware',  
    'Django.middleware.common.CommonMiddleware',  
    ...
)

CORS_Origin_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
CORS_Origin_WHITELIST = (
    'localhost:3030',
)
CORS_Origin_REGEX_WHITELIST = (
    '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

20
likaiguo.happy

Vous pouvez le faire en utilisant un middleware personnalisé, tout 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
)
9
Julio Marins

Au cas où quelqu'un reviendrait sur 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
5
masnun

Pour Django versions> 1.10, selon la documentation , un MIDDLEWARE personnalisé peut être écrit sous forme de 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 des MIDDLEWARE dans le settings.py de votre projet:

MIDDLEWARE = [
  .
  .
  'Django.middleware.clickjacking.XFrameOptionsMiddleware',
  'yourproject.middleware.open_access_middleware'
]

Peasy facile!

4
Dhruv Batheja

Eh bien, je ne connais pas les gars mais:

en utilisant ici python 3.6 et Django 2.2

Renommer MIDDLEWARE_CLASSES en MIDDLEWARE dans settings.py a fonctionné.

1
jnowak

Vous devrez peut-être également ajouter le modèle CorsModel à votre base de données. Je recevais des exceptions en essayant de le vider autrement.

python3 manage.py makemigrations corsheaders
python3 manage.py migrate
0
Rémi Héneault