記事ディレクトリ
Cors クロスドメイン問題
-
次のように、クロスオリジン リソース共有 (CORS) の問題は、ローカル開発フェーズと Heroku デプロイメント フェーズの両方で発生する可能性があります。
-
ローカル開発段階の問題
CORS
:-
フロントエンド アプリケーション (Vue.js や React アプリケーションなど) とバックエンド サービス (Django や Node.js サーバーなど) を異なるポートでローカルに実行すると、問題が発生する可能性があります
CORS
。ブラウザーはセキュリティ上の理由から同一オリジン ポリシーを強制します。つまり、1 つのオリジン (同じプロトコル、ドメイン名、ポートを持つ) からの JavaScript は、そのオリジン上のリソースにのみアクセスできます。別のオリジンからリソースを取得しようとすると、CORS
エラーが発生します。 -
たとえば、フロントエンド アプリケーションが で実行され
localhost:3000
、バックエンド サービスが で実行されているlocalhost:8000
場合、フロントエンド アプリケーションからバックエンド サービスに送信されるリクエストはクロスオリジン リクエストとみなされます。
-
-
Heroku 導入段階での CORS の問題:
- Heroku またはその他の実稼働環境にデプロイした後、フロントエンド アプリケーションとバックエンド サービスは異なるドメインでホストされる場合があります。たとえば、フロントエンド アプリは Netlify または Vercel (例: https://your-frontend.netlify.app) でホストされ、バックエンド サービスは Heroku (例: https://your-backend.herokuapp.com) でホストされている場合があります。この場合、フロントエンド アプリケーションによってバックエンド サービスに送信されるすべてのリクエストは、クロスオリジン リクエストとみなされます。
- または、バックエンド コードが Heroku にデプロイされているが、フロントエンド コードがまだそこにある場合は
local
、バックエンドをリクエストするフロントエンドに依然としてCORS
問題があります。 - これらの問題を解決するには、フロントエンド アプリケーションからのクロスオリジン リクエストを許可するようにバックエンド サービスを構成する必要があります。Django では、
django-cors-headers
パッケージを使用してこれを行うことができます。
-
以下に、さまざまな段階でのクロスドメインの問題の解決策を紹介します。
ローカルホストステージ
-
クロスドメイン問題を解決するための基本的なアイデアは、これを使用することです
CORS header
。もちろん、ローカルで開発する場合は設定する必要はありませんCORS headers
が、次のように、Cors
問題を引き起こす可能性のある各関数に修飾子記号を追加するだけです。@csrf_exempt
-
これはデバッグ時に非常に便利です
-
Django では、
@csrf_exempt
特定のビュー関数でその関数を CSRF 保護から除外するために使用できるデコレーターです。@csrf_exempt
ビュー関数を で修飾すると、その関数は CSRF 保護の対象から除外されます。つまり、この関数へのリクエストはPOST
を運ぶ必要がありませんCSRF token
。 -
@csrf_exempt
使用方法の例を次に示します。from django.views.decorators.csrf import csrf_exempt @csrf_exempt def my_view(request): pass
-
繰り返しますが、これはローカルでは便利ですが、実際にサーバーを展開するときは、依然としてクロスドメインの問題を解決する必要があります。
Heroku の導入段階
- この時は安全に変更したほうが良いですが、
header
具体的な方法は以下の通りです。
-
django-cors-headers
ライブラリをインストールします。pip install django-cors-headers
-
settings.py
これを次のファイルに追加しますINSTALLED_APPS
。INSTALLED_APPS = [ ... 'corsheaders', ... ]
-
settings.py
の先頭に次の内容を追加しMIDDLEWARE
ます。CorsMiddleware
MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', ... ]
-
次に、次の設定を設定に追加する必要があります。
MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', ... ]
Procfile 起動ファイル
-
Procfile
Heroku がアプリケーションの実行方法を知るために使用するファイル。このファイルでは、アプリケーションのさまざまなプロセス タイプと、これらのプロセスに対応するコマンドを定義します。 -
このファイルには接尾辞がありません。自分で接尾辞を追加しないでください。追加する場合は、システムがデフォルトで末尾を追加しないように
macos
注意してください。.txt
-
たとえば、典型的な Django アプリは
Procfile
次のようになります。web: gunicorn YOUR_PROJECT_NAME.wsgi
-
さらに、アプリケーションの新しいバージョンがデプロイされるたびに実行されるプロセスであるプロセス タイプを
Procfile
含めることもできます。release
たとえば、release
このプロセスを使用してデータベース移行を実行できます。これについては後で説明します。 -
一般に、
Procfile
これは、どのプロセスを開始するか、どのように開始するかなど、アプリケーションの実行方法を Heroku に指示する重要なファイルです。
データベース データベース関連コンテンツ
ローカルホストステージ
django.db.utils.OperationalError: no such table: nnsh_backend_new_roommember
-
nnsh_backend_new_roommember。この問題は、次の理由によって発生する可能性があります。
-
python manage.py makemigrations
移行のないモデル: Django で新しいモデルを作成するか、既存のモデルを変更する場合は、移行ファイル (パス) を作成してから、移行を適用する (パス)必要がありますpython manage.py migrate
。移行を適用しない場合、データベース テーブルは作成されません。 -
データベースが同期していない: この問題は、データベースがコードと同期していない場合に発生する可能性があります。たとえば、開発環境でデータベースを作成して移行したが、実稼働環境では同じことを実行しなかった場合です。
-
間違ったデータベース設定: Django の settings.py ファイルで、データベース エンジン、データベース名、ユーザー、パスワードなどを含む DATABASES の正しい値を設定する必要があります。
-
-
そこで私は試してみます:
python manage.py makemigrations python manage.py migrate
-
しかし、うまくいかなかったので、いくつか調べた後、次のコマンドを使用してください。
python manage.py makemigrations YOUR_PROJECT_NAME python manage.py migrate
-
したがって、変更されたコマンドは次のようになります。
python manage.py makemigrations nnsh_backend_new python manage.py migrate
Heroku の導入段階
導入段階では、データベースはいくつかの重要な問題に直面します。
settings.pyの正しい設定方法
- Heroku をデプロイする場合、公式 Web サイトには参考用の
settings.py
テンプレートが提供されています。 - この部分
settings.py
はDataset
次のように定義されます。
公式設定.py
-
上記は私が変更したコードですが、
settings.py
例は次のとおりです。
-
settings.py
公式の「バージョン情報」Database
セクションには完全な説明が記載されていないことがわかります。これが問題を引き起こしました。つまり、最初にコードを Heroku にデプロイしたとき、データベースに関するエラーが常に報告され、実際のエラー メッセージは次のとおりです。django.core.exceptions.ImproperlyConfigured: settings.DATABASES is improperly configured. Please supply the ENGINE value. Check settings documentation for more details.
-
これは、Django がデータベース操作を実行しようとしたときに有効なデータベース エンジン構成を見つけることができなかったことを示しています。ただし、データベースは公式の設定に従ってセットアップしたので、heroku データベースはローカル展開とは大きく異なり、事前に手動で設定および構成する必要があるのではないかと思います。
-
そうであることが確認されています。データベースを含む Django アプリケーションを Heroku にデプロイする場合は、データベースを Heroku 上にセットアップする必要があります。Heroku のサービスを使用したい場合は、
Postgres
Heroku にapp settings
Heroku アドオンを追加できますPostgres
。これにより、新しいPostgreSQL
データベースが自動的に作成され、接続情報がDATABASE_URL
環境変数に保存されます。 -
このデータベースを手動で設定する方法は次のとおりです。
Overview->Config Add-ons
-
検索
heroku postgres
して追加
-
データベースを追加すると、Heraku は新しいデータベースへの接続に必要なすべての情報を
DATABASE_URL
含む環境変数を自動的に設定します。Heroku Postgres
-
次に、
settings.py
その行を私の方法で追加します
-
上記のコードは、環境変数 (Heraku によって自動的に設定される) 内のデータベース URL を読み取り、それを使用して Django の
DATABASES
設定を構成します。
makemigration とデータ移行を移行する
-
ここで終わりではありません。データベースを Heroku にセットアップして で
settings
構成した後、データを移行する必要もあります。これがmigration
操作です。 -
Procfile
アプリケーション全体を開始する前にこの部分を完了する必要があり、アプリケーションの起動はファイルに基づいているためweb: gunicorn YOUR_PROJECT_NAME.wsgi
、この文の前に完了する必要がありますmigration
-
そこで、次
Procfile
の文を追加します。release: python manage.py makemigrations YOUR_PROJECT_NAME && python manage.py migrate web: gunicorn YOUR_PROJECT_NAME.wsgi
-
の部分に必ず注意してください。
YOUR_PROJECT_NAME
自分のプロジェクトの名前を使用してください。間違えないでください~
requirements.txt および runtime.txt のバージョンとライブラリ
requirements.txt
Heroku のデプロイに必要なすべてのパッケージのバージョン情報がファイルに事前に書き込まれています。runtime.txt
ファイルは指定されたpython
バージョンです。heroku 自体は多くのバージョンをサポートしていないため、開始する前に heroku がサポートできるバージョンをpython
調べる必要があります。詳細については、 heroku に関する私の他の記事を参照してください。python
- すべての重要なパッケージが書き込まれていることを確認するには、必ず
requirements.txt
複数回チェックする必要があることを確認してください。これを見逃すと、debug
特にいくつかの特に重要なパッケージで非常に手間がかかります。Diango==4.0.1 gunicorn==20.1.0 diango-heroku==0.3.1
要約する
- クロスドメインの問題、
cors header
解決するために使用し、対応するsettings.py
部分を変更するために使用します Procfile
サフィックスはなく、デプロイメント用のプログラム起動ファイルであり、heroku データベースの移行操作も行うことができることに注意してください。requirments.txt
必ず全文を記入し、バージョンをruntime.txt
指定してくださいpython
settings.py
公式 Web サイトの指示に従いますが、データベース部分の定義に注意してください。同時に、最初に Heroku でデータベースを手動で設定するOverview
ことを忘れないでくださいPostgres
。そうしないと、データベース呼び出しが失敗します。