web-dev-qa-db-ja.com

Django LocalhostCORSが機能していません

私はローカルDjangoセットアップを次のようにしています

Django Rest Frameworklocalhost:8000

AngularJS frontendlocal Apache running on http://localservername

Django-cors-headersをインストールし、settings.pyに、

CORS_Origin_WHITELIST = (
    'http://localhost',
    'localservername',
    'http://localservername',
    '127.0.0.1'
)


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',
)

ただし、No 'Access-Control-Allow-Origin' header is present on the requested resource.から提供されるAPIをヒットすると、Rest Frameworkエラーが発生します。 CORS_Origin_ALLOW_ALL = Trueを設定すると、APIは正しく機能しますが、サーバー側のデータにとっては非常に安全ではありません。

これを修正するには何を変更する必要がありますか?

12
Newtt

http://www.w3.org/Security/wiki/Same_Origin_Policy に従って、リクエストは同じポート、スキーム、およびホストからのものであり、同じオリジンと見なされます。ここで、サーバーの1つはポート80にあり、もう1つは8080にあります。

オリジンは、URLのスキーム、ホスト、およびポートによって定義されます。一般的に言えば、異なる出所から取得されたドキュメントは互いに分離されています。たとえば、 http://example.com/doc.html から取得したドキュメントが https://example.com/target)から取得したドキュメントのDOMにアクセスしようとしたとします。 html 、最初のドキュメントのオリジン(http、example.com、80)が2番目のドキュメントのオリジン(https、example.com、443)と一致しないため、ユーザーエージェントはアクセスを許可しません。

1
Mevin Babu

私も同じ問題を抱えていました。 Django-cors-headers-コードを閲覧すると、私の間違いは次のとおりでした。

完全なCORSヘッダーは次のようになりますが(スキーマとホスト名に注意してください):

Access-Control-Allow-Origin: https://example.com

CORS_Origin_WHITELIST設定では、ホスト(おそらくポート)のみであるOrigin-ヘッダーのurlparse.netlocdocs )と比較できる形式である必要があります。 )

def Origin_found_in_white_lists(self, Origin, url):
    return (
        url.netloc in conf.CORS_Origin_WHITELIST or
        (Origin == 'null' and Origin in conf.CORS_Origin_WHITELIST) or
        self.regex_domain_match(Origin)
    )

RegEx-ホワイトリストはそれを完全なOrigin-ヘッダーと比較します。

したがって、正しい設定(セットアップマニュアルの例のように、正しく記載されていますが、適切に説明されていません)は次のようになります。

CORS_Origin_WHITELIST = (
    'example.com',
)

APIが安全でないhttpバージョンのWebサイトと通信することを望まない場合、これは問題になる可能性があります。その場合は正規表現を使用してください。

また、トラブルシューティング中に、一致するものが見つからない場合、CORSヘッダーが完全に存在しないことがわかりました。つまり、ヘッダーがないということは、ミドルウェアが完全に誤動作していることを確実に示しているわけではなく、構成が間違っているだけかもしれません。

3
Chris

中括弧は私にとって重要です。()の代わりに[]を使用してください。Djangoで確認しましたが、他のチェックはしていません。

このように書く:

CORS_Origin_WHITELIST = [' https:// localhost:30 ']

1
Abhishek Anand

CORS_Origin_WHITELIST = [' https:// localhost:30 ']正常に動作します。

1
nroy

これは私のために働きます、これでチェックしてください、それはあなたがあなたの問題を解決するのを助けるかもしれません。

CORS_Origin_WHITELIST = (
    'http://localhost',
)
1
Narayan

Django-cors-headersのドキュメント からホワイトリストコードをコピーして、変更するだけです。

CORS_Origin_WHITELIST = [
    "https://example.com",
    "https://sub.example.com",
    "http://localhost:8080",
    "http://127.0.0.1:9000"
]

それはあなたがタイプミスをしなかったことをあなたに保証するでしょう。

0
elano7

多分中括弧が重要

[] の代わりに ()

CORS_Origin_WHITELIST = [

    'http://localhost',

    'localservername',

    'http://localservername',

    '127.0.0.1'

]

動作するはずです

0
azamat alibaev

CORS_Origin_WHITELIST = [' https:// localhost:30 ']のように書くことは私にとってはうまくいきました。

0
Rizwan Ahmed