Django-cors-headersが機能しない
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
すべて正常ですが、動作しませんでした
ここに私の応答ヘッダー
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
CorsMiddleware のprocess_responseコードによると:
response[ACCESS_CONTROL_ALLOW_Origin] = "*" if (
settings.CORS_Origin_ALLOW_ALL and
not settings.CORS_ALLOW_CREDENTIALS) else Origin
次のように設定する必要があります。
# CORS Config
CORS_Origin_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = False
これをテストする場合は、少なくともリクエストにOriginヘッダーを含める必要があります。
例えば。:
$ 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
プリフライト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
Corsheaderとclickjackingミドルウェアは互換性がないと思います。少なくとも、コメントアウトしたときにX-Frame-Optionsヘッダーを削除しましたDjango.middleware.clickjacking.XFrameOptionsMiddleware
。
私はただCORS_Origin_ALLOW_ALL = True
設定。
私はこれと同じ問題を抱えていて、すべてが適切な場所にあるように見えました。次に、'corsheaders.middleware.CorsMiddleware',
をMIDDLEWARE_CLASSES
に追加する前にサーバーを起動したことがわかりました。修正を行った後、まだ機能していませんでした。たくさんのことを試した後、別のブラウザーでそれを開きましたが、うまくいきました。それで、ブラウザのキャッシュをクリアするだけでいいことがわかりました。
From Django 2 MIDDLEWARE_CLASSESはMIDDLEWAREに変更されます。この場合、Django 2を持っている場合は、MIDDLEWARESが実行されるようにMIDDLWAREが正しいことを確認してください。
追加することを忘れないでください
「corsheaders.middleware.CorsMiddleware」、
mIDDLEWARE変数の先頭:
ドキュメントを参照してください:
CorsMiddlewareは、特にDjangoのCommonMiddlewareやWhitenoiseのWhiteNoiseMiddlewareなどの応答を生成できるミドルウェアの前に、できるだけ高く配置する必要があります。以前ではない場合、CORSヘッダーをこれらの応答に追加できません。
最終的な解決策は、CORS許可ヘッダー付きの応答を送信することです。
response["Access-Control-Allow-Origin"] = "*"
response['Content-Type'] = "application/json; charset=utf-8"
response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Methods"] = "GET, OPTIONS"
response["Access-Control-Max-Age"] = "1000"
response["Access-Control-Allow-Headers"] = "X-Requested-With, Content-Type, My-Token"