Django REST FrameworkでCORSを有効にするにはどうすればよいですか


回答:


146

質問で参照したリンクは、ライブラリのインストールdjango-cors-headersドキュメントに記載しているの使用を推奨しています

pip install django-cors-headers

インストールしたアプリに追加します。

INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
)

また、応答をリッスンするミドルウェアクラスを追加する必要があります。

MIDDLEWARE_CLASSES = (
    ...
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
)

さまざまな設定に特に注意して、ドキュメントの構成セクションを参照しくださいCORS_ORIGIN_。必要に応じて、それらのいくつかを設定する必要があります。


2
新しい依存関係をインストールする必要なく、それを行う他の方法を知っていますか?私はミドルウェアクラスを作成しようとしています
Julio Marins、

5
@ JulioMarins、12個のリリース、21の貢献者、800を超えるスター、100を超えるフォークを備えた、すぐに入手可能で簡単にインストールできる独自のバージョンを作成するのはなぜですか?
Chris

2
確かに要点はありますが、単純なCORSの唯一の必要性はヘッダーAccess-Control-Allow-Origin: *であるので、なぜ全体をロードするのかわかりません。両方の方法を使用できるように、これを別の方法で回答に含めます。参照:[リンク(] enable-cors.org/server.html
フリオマリーンズ

2
@JulioMarins、それは大槌のアプローチでしょう。私が提供した構成リンクを見るとdjango-cors-headers、それよりもはるかに柔軟であることがわかります。独自のクラスを作成したい場合は、私のゲストになってください。しかし、私はそのライブラリを使用します。
Chris

4
@Chris 呼び出し元のホストをホワイトリストに登録するには、CORS_ORIGIN_WHITELISTを追加する必要があると思います。
ハキム

58
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

公式ドキュメントを読んで、ほとんどすべての問題を解決できます


4
@Chrisの回答に追加した4行を追加することは、これが機能するために必要でした。
マットD

5
なぜですがCORS_ORIGIN_ALLOW_ALL = TrueCORS_ORIGIN_WHITELISTまだ設定されていますか?ドキュメントはこれが必要ではないように思われ、ここで答えを混乱させるようです。
フェニックス

CORS_ORIGIN_ALLOW_ALL Trueの場合、ホワイトリストは使用されず、すべてのオリジンが受け入れられます。
BjornW

2
また'corsheaders.middleware.CorsMiddleware',、リストの一番上にある必要があることに注意してください。そうしないと、接続が到達する前に拒否される可能性があります。
セバスティアンVansteenkiste

14

最適なオプションはパッケージのテスト済みのアプローチを使用していることを知っていても、カスタムミドルウェアを使用して実行できます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
)

フリオ、ありがとう!ミドルウェアコードは、@ masnunコードサンプルで更新する必要があります。また、からインポートすると、インポートが機能しません。問題を修正: from . import corsMiddleware
Pavel Daynyak

12

誰かがこの質問に戻り、独自のミドルウェアを作成することにした場合、これは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

7

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'
]

かんたん簡単!


以前に投稿されたアプローチはMIDDLEWAREではなくMIDDLEWARE_CLASSESを使用します。この手法は機能するので、反対投票は行われませんでした:) @JulioMarins
Dhruv Batheja

1
男、解決策は同じです。Djangoバージョンでの実装について議論しています。また、あなたのコードは、で間違ったインデントになっていopen_access_middlewareます。
Julio Marins、2018

4

まあ、私は人を知りませんが:

ここでpython 3.6とdjango 2.2を使用

settings.pyでMIDDLEWARE_CLASSESをMIDDLEWAREに名前変更できました。


3

以下は、外部モジュールを必要としない作業手順です。

ステップ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モジュールを作成したアプリの名前に置き換えてください。

これで、必要な応答ヘッダーがプロジェクトのすべてのビューに追加されることを確認できます。


0

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',
    ),
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.