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
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
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
.
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é.
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.
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