web-dev-qa-db-ja.com

Django REST FrameworkでCORSを有効にする方法

Django RESTフレームワークでCORSを有効にするにはどうすればよいですか? reference はあまり役に立ちません。ミドルウェアでできると言っていますが、どうすればいいですか?

61
Julio Marins

質問で参照したリンクは、 Django-cors-headers の使用を推奨しています。この documentation は、ライブラリのインストールを指示しています

pip install Django-cors-headers

そして、インストールしたアプリに追加します:

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

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

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

また、さまざまなCORS_Origin_設定に特に注意して、ドキュメントの 構成セクション を参照することもできます。

92
Chris
pip install Django-cors-headers

そして、インストールしたアプリに追加します:

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

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

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

CORS_Origin_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
CORS_Origin_WHITELIST = [
    'http://localhost:3030',
]
CORS_Origin_REGEX_WHITELIST = [
    'http://localhost:3030',
]

詳細: https://github.com/ottoyiu/Django-cors-headers/#configuration

ほぼすべての問題を解決できる公式ドキュメントを読む

25
likaiguo.happy

最適なオプションは、パッケージ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
)
12
Julio Marins

誰かがこの質問に戻って独自のミドルウェアを書くことにした場合、これは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
masnun

Djangoバージョン> 1.10の場合、 documentation に従って、カスタム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パス(プロジェクトのルート)をプロジェクトのsettings.pyのMIDDLEWAREリストに追加します。

MIDDLEWARE = [
  .
  .
  'Django.middleware.clickjacking.XFrameOptionsMiddleware',
  'yourproject.middleware.open_access_middleware'
]

簡単!

4
Dhruv Batheja

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

ここpython 3.6およびDjango 2.2を使用

Settings.pyでMIDDLEWARE_CLASSESの名前をMIDDLEWAREに変更しました。

1
jnowak

CorsModelモデルをデータベースに追加する必要がある場合もあります。そうでなければ、フラッシュしようとして例外が発生していました。

python3 manage.py makemigrations corsheaders
python3 manage.py migrate
0
Rémi Héneault