落とし穴ガイド: Django プロジェクトを Heroku にデプロイするときに、回避する必要がある落とし穴はいくつありますか?

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具体的な方法は以下の通りです。
  1. django-cors-headersライブラリをインストールします。

    pip install django-cors-headers
    
  2. settings.pyこれを次のファイルに追加しますINSTALLED_APPS

    INSTALLED_APPS = [
        ...
        'corsheaders',
        ...
    ]
    
  3. settings.py先頭に次の内容を追加しMIDDLEWAREますCorsMiddleware

    MIDDLEWARE = [
        'corsheaders.middleware.CorsMiddleware',
        ...
    ]
    
  4. 次に、次の設定を設定に追加する必要があります。

    MIDDLEWARE = [
        'corsheaders.middleware.CorsMiddleware',
        ...
    ]
    

Procfile 起動ファイル

  • ProcfileHeroku がアプリケーションの実行方法を知るために使用するファイル。このファイルでは、アプリケーションのさまざまなプロセス タイプと、これらのプロセスに対応するコマンドを定義します。

  • このファイルには接尾辞がありません。自分で接尾辞を追加しないでください。追加する場合は、システムがデフォルトで末尾を追加しないように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.pyDataset次のように定義されます。
    ここに画像の説明を挿入

公式設定.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 のサービスを使用したい場合は、 PostgresHeroku にapp settingsHeroku アドオンを追加できます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.txtHeroku のデプロイに必要なすべてのパッケージのバージョン情報がファイルに事前に書き込まれています。
  • runtime.txtファイルは指定されたpythonバージョンです。heroku 自体は多くのバージョンをサポートしていないため、開始する前に heroku がサポートできるバージョンをpython調べる必要があります。詳細については、 heroku に関する私の他の記事を参照してください。python
  • すべての重要なパッケージが書き込まれていることを確認するには、必ずrequirements.txt複数回チェックする必要があることを確認してください。これを見逃すと、debug特にいくつかの特に重要なパッケージで非常に手間がかかります。
    Diango==4.0.1
    gunicorn==20.1.0
    diango-heroku==0.3.1
    

要約する

  1. クロスドメインの問題、cors header解決するために使用し、対応するsettings.py部分を変更するために使用します
  2. Procfileサフィックスはなく、デプロイメント用のプログラム起動ファイルであり、heroku データベースの移行操作も行うことができることに注意してください。
  3. requirments.txt必ず全文を記入し、バージョンをruntime.txt指定してくださいpython
  4. settings.py公式 Web サイトの指示に従いますが、データベース部分の定義に注意してください。同時に、最初に Heroku でデータベースを手動で設定するOverviewことを忘れないでくださいPostgres。そうしないと、データベース呼び出しが失敗します。

おすすめ

転載: blog.csdn.net/qq_42902997/article/details/131522220