Django RESTフレームワークでCORSを有効にするにはどうすればよいですか?参照は、それは私がミドルウェアによって行うことができますと言って、あまり役に立ちませんが、私はどのようにそれを行うことができますか?
回答:
質問で参照したリンクは、ライブラリのインストールdjango-cors-headers
をドキュメントに記載しているの使用を推奨しています
pip install django-cors-headers
インストールしたアプリに追加します。
INSTALLED_APPS = (
...
'corsheaders',
...
)
また、応答をリッスンするミドルウェアクラスを追加する必要があります。
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)
さまざまな設定に特に注意して、ドキュメントの構成セクションを参照してくださいCORS_ORIGIN_
。必要に応じて、それらのいくつかを設定する必要があります。
Access-Control-Allow-Origin: *
であるので、なぜ全体をロードするのかわかりません。両方の方法を使用できるように、これを別の方法で回答に含めます。参照:[リンク(] enable-cors.org/server.html)
django-cors-headers
、それよりもはるかに柔軟であることがわかります。独自のクラスを作成したい場合は、私のゲストになってください。しかし、私はそのライブラリを使用します。
pip install django-cors-headers
インストールしたアプリに追加します。
INSTALLED_APPS = (
...
'corsheaders',
...
)
また、応答をリッスンするミドルウェアクラスを追加する必要があります。
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)
CORS_ORIGIN_ALLOW_ALL = True # If this is used then `CORS_ORIGIN_WHITELIST` will not have any effect
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = [
'http://localhost:3030',
] # If this is used, then not need to use `CORS_ORIGIN_ALLOW_ALL = True`
CORS_ORIGIN_REGEX_WHITELIST = [
'http://localhost:3030',
]
詳細:https : //github.com/ottoyiu/django-cors-headers/#configuration
公式ドキュメントを読んで、ほとんどすべての問題を解決できます
'corsheaders.middleware.CorsMiddleware',
、リストの一番上にある必要があることに注意してください。そうしないと、接続が到達する前に拒否される可能性があります。
最適なオプションはパッケージのテスト済みのアプローチを使用していることを知っていても、カスタムミドルウェアを使用して実行できますdjango-cors-headers
。そうは言っても、ここに解決策があります:
次の構造とファイルを作成します。
- myapp/middleware/__init__.py
from corsMiddleware import corsMiddleware
- myapp/middleware/corsMiddleware.py
class corsMiddleware(object):
def process_response(self, req, resp):
resp["Access-Control-Allow-Origin"] = "*"
return resp
settings.py
マークされた行に追加:
MIDDLEWARE_CLASSES = (
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
# Now we add here our custom middleware
'app_name.middleware.corsMiddleware' <---- this line
)
from . import corsMiddleware
誰かがこの質問に戻り、独自のミドルウェアを作成することにした場合、これはDjangoの新しいスタイルのミドルウェアのコードサンプルです。
class CORSMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
response["Access-Control-Allow-Origin"] = "*"
return response
Djangoバージョン1.10以上の場合、ドキュメントによれば、カスタムMIDDLEWAREは関数として記述できます。たとえば、次のようにファイルに記述しますyourproject/middleware.py
(の兄弟としてsettings.py
):
def open_access_middleware(get_response):
def middleware(request):
response = get_response(request)
response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Headers"] = "*"
return response
return middleware
最後に、この関数のpythonパス(プロジェクトのルートを記述)をプロジェクトのMIDDLEWAREリストに追加しますsettings.py
。
MIDDLEWARE = [
.
.
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'yourproject.middleware.open_access_middleware'
]
かんたん簡単!
open_access_middleware
ます。
以下は、外部モジュールを必要としない作業手順です。
ステップ1:アプリでモジュールを作成します。
たとえば、user_registration_appというアプリがあるとします。user_registration_appを調べて、新しいファイルを作成します。
これをcustom_cors_middleware.pyと呼びましょう
以下のクラス定義を貼り付けます。
class CustomCorsMiddleware:
def __init__(self, get_response):
self.get_response = get_response
# One-time configuration and initialization.
def __call__(self, request):
# Code to be executed for each request before
# the view (and later middleware) are called.
response = self.get_response(request)
response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Headers"] = "*"
# Code to be executed for each request/response after
# the view is called.
return response
ステップ2:ミドルウェアを登録する
プロジェクトのsettings.pyファイルに、この行を追加します
「user_registration_app.custom_cors_middleware.CustomCorsMiddleware」
例えば:
MIDDLEWARE = [
'user_registration_app.custom_cors_middleware.CustomCorsMiddleware', # ADD THIS LINE BEFORE CommonMiddleware
...
'django.middleware.common.CommonMiddleware',
]
user_registration_appは、custom_cors_middleware.pyモジュールを作成したアプリの名前に置き換えてください。
これで、必要な応答ヘッダーがプロジェクトのすべてのビューに追加されることを確認できます。
Django = 2.2.12 django-cors-headers = 3.2.1 djangorestframework = 3.11.0
公式の指示に従ってくださいが機能しません
最後に、古い方法でそれを理解します。
追加:
# proj/middlewares.py
from rest_framework.authentication import SessionAuthentication
class CsrfExemptSessionAuthentication(SessionAuthentication):
def enforce_csrf(self, request):
return # To not perform the csrf check previously happening
#proj/settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'proj.middlewares.CsrfExemptSessionAuthentication',
),
}