web-dev-qa-db-fra.com

django-cors-headers ne fonctionne pas

Django-cors-headers ne fonctionne pas

INSTALLED_APPS = (
    'Django.contrib.admin',
    'Django.contrib.auth',
    'Django.contrib.contenttypes',
    'Django.contrib.sessions',
    'Django.contrib.messages',
    'Django.contrib.staticfiles',
    'Django.contrib.gis',
    'corsheaders',
    'rest_framework',
    'world',
    'userManager',
    'markPost',
    'BasicServices',
)


MIDDLEWARE_CLASSES = (
    'Django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'Django.middleware.common.CommonMiddleware',
    'Django.middleware.csrf.CsrfViewMiddleware',
    'Django.contrib.auth.middleware.AuthenticationMiddleware',
    'Django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'Django.contrib.messages.middleware.MessageMiddleware',
    'Django.middleware.clickjacking.XFrameOptionsMiddleware',
)

CORS_Origin_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True

Tout est normal, mais n'a pas fonctionné

ici mes en-têtes de réponse

Cache-Control: max-age=0
Content-Type: text/html; charset=utf-8
Date: Tue, 20 Jan 2015 13:16:17 GMT
Expires: Tue, 20 Jan 2015 13:16:17 GMT
Last-Modified: Tue, 20 Jan 2015 13:16:17 GMT
Server: WSGIServer/0.1 Python/2.7.8
Set-Cookie: csrftoken=snXksqpljbCLW0eZ0EElFxKbiUkYIvK0; expires=Tue, 19-Jan-2016 13:16:17 GMT; Max-Age=31449600; Path=/
Vary: Cookie
X-Frame-Options: SAMEORIGIN
16
Aby-Chan

Selon le code process_response de CorsMiddleware :

response[ACCESS_CONTROL_ALLOW_Origin] = "*" if (
            settings.CORS_Origin_ALLOW_ALL and
            not settings.CORS_ALLOW_CREDENTIALS) else Origin

Vous devez définir les paramètres comme ceci:

# CORS Config
CORS_Origin_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = False
10
danius

Je suppose que les corsheaders et les middlewares clickjacking ne sont pas compatibles. Au moins, je me suis débarrassé de l'en-tête X-Frame-Options en commentant Django.middleware.clickjacking.XFrameOptionsMiddleware

Je viens de régler CORS_Origin_ALLOW_ALL = True.

4
A. Rista

Depuis Django 2, MIDDLEWARE_CLASSES est remplacé par MIDDLEWARE. Dans ce cas, si vous avez Django 2, assurez-vous que le MIDDLWARE est tel qu’il devrait être tel que MIDDLEWARES soit exécuté. 

3
Euron Metaliaj

N'oubliez pas d'ajouter 

'corsheaders.middleware.CorsMiddleware',

en haut de la variable MIDDLEWARS:

Voir docs: 

CorsMiddleware doit être placé aussi haut que possible, surtout avant tout middleware pouvant générer des réponses telles que celle de Django CommonMiddleware ou WhiteNoiseMiddleware de Whitenoise. Si ce n'est pas le cas auparavant, il ne sera pas possible d’ajouter les en-têtes CORS à ceux-ci les réponses.

3
GreGGus

Si vous testez cela, vous devez vous assurer d'inclure au moins l'en-tête Origin dans la demande. 

Par exemple.:

$ http GET http://127.0.0.1:8000/todos/ Origin:http://www.someorigin.com
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Date: Sat, 14 Nov 2015 04:42:38 GMT
Server: WSGIServer/0.1 Python/2.7.10
Vary: Accept, Cookie
X-Frame-Options: SAMEORIGIN

Vous obtiendrez plus de commentaires avec une demande preflight CORS:

$ http OPTIONS http://127.0.0.1:8000/todos/ Origin:http://www.someorigin.com
HTTP/1.0 200 OK
Access-Control-Allow-Headers: x-requested-with, content-type, accept, Origin, authorization, x-csrftoken, user-agent, accept-encoding
Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, OPTIONS
Access-Control-Allow-Origin: *
Access-Control-Max-Age: 86400
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Date: Sat, 14 Nov 2015 04:45:37 GMT
Server: WSGIServer/0.1 Python/2.7.10
Vary: Accept, Cookie
X-Frame-Options: SAMEORIGIN
3
mixja