web-dev-qa-db-ja.com

django-cors-headersは機能しません

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
19
Aby-Chan

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
13
danius

これをテストする場合は、少なくともリクエストに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
5
mixja

Corsheaderとclickjackingミドルウェアは互換性がないと思います。少なくとも、コメントアウトしたときにX-Frame-Optionsヘッダーを削除しましたDjango.middleware.clickjacking.XFrameOptionsMiddleware

私はただCORS_Origin_ALLOW_ALL = True設定。

4
A. Rista

私はこれと同じ問題を抱えていて、すべてが適切な場所にあるように見えました。次に、'corsheaders.middleware.CorsMiddleware',MIDDLEWARE_CLASSESに追加する前にサーバーを起動したことがわかりました。修正を行った後、まだ機能していませんでした。たくさんのことを試した後、別のブラウザーでそれを開きましたが、うまくいきました。それで、ブラウザのキャッシュをクリアするだけでいいことがわかりました。

4
bitigital

From Django 2 MIDDLEWARE_CLASSESはMIDDLEWAREに変更されます。この場合、Django 2を持っている場合は、MIDDLEWARESが実行されるようにMIDDLWAREが正しいことを確認してください。

3
Euron Metaliaj

追加することを忘れないでください

「corsheaders.middleware.CorsMiddleware」、

mIDDLEWARE変数の先頭:

ドキュメントを参照してください:

CorsMiddlewareは、特にDjangoのCommonMiddlewareやWhitenoiseのWhiteNoiseMiddlewareなどの応答を生成できるミドルウェアの前に、できるだけ高く配置する必要があります。以前ではない場合、CORSヘッダーをこれらの応答に追加できません。

3
GreGGus

最終的な解決策は、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"
0
Googlian