私はローカルDjangoセットアップを次のようにしています
Django Rest Framework
:localhost:8000
AngularJS frontend
:local 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は正しく機能しますが、サーバー側のデータにとっては非常に安全ではありません。
これを修正するには何を変更する必要がありますか?
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)と一致しないため、ユーザーエージェントはアクセスを許可しません。
私も同じ問題を抱えていました。 Django-cors-headers
-コードを閲覧すると、私の間違いは次のとおりでした。
完全なCORSヘッダーは次のようになりますが(スキーマとホスト名に注意してください):
Access-Control-Allow-Origin: https://example.com
CORS_Origin_WHITELIST
設定では、ホスト(おそらくポート)のみであるOrigin
-ヘッダーのurlparse.netloc
( docs )と比較できる形式である必要があります。 )
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ヘッダーが完全に存在しないことがわかりました。つまり、ヘッダーがないということは、ミドルウェアが完全に誤動作していることを確実に示しているわけではなく、構成が間違っているだけかもしれません。
中括弧は私にとって重要です。()の代わりに[]を使用してください。Djangoで確認しましたが、他のチェックはしていません。
このように書く:
CORS_Origin_WHITELIST = [' https:// localhost:30 ']
CORS_Origin_WHITELIST = [' https:// localhost:30 ']正常に動作します。
これは私のために働きます、これでチェックしてください、それはあなたがあなたの問題を解決するのを助けるかもしれません。
CORS_Origin_WHITELIST = (
'http://localhost',
)
Django-cors-headersのドキュメント からホワイトリストコードをコピーして、変更するだけです。
CORS_Origin_WHITELIST = [
"https://example.com",
"https://sub.example.com",
"http://localhost:8080",
"http://127.0.0.1:9000"
]
それはあなたがタイプミスをしなかったことをあなたに保証するでしょう。
多分中括弧が重要
[] の代わりに ()
CORS_Origin_WHITELIST = [
'http://localhost',
'localservername',
'http://localservername',
'127.0.0.1'
]
動作するはずです
CORS_Origin_WHITELIST = [' https:// localhost:30 ']のように書くことは私にとってはうまくいきました。