web-dev-qa-db-ja.com

Djangoのcollectstaticのポイントは何ですか?

これはおそらくばかげた質問ですが、頭の中でクリックするだけではありません。

Djangoでは、アプリ固有のすべての静的ファイル(css、js)をstaticというフォルダーに配置するのが慣例です。したがって、構造は次のようになります。

mysite/
    manage.py
    mysite/ --> (settings.py, etc)
    myapp/ --> (models.py, views.py, etc)
        static/

Mysite/settings.pyには次のものがあります。

STATIC_ROOT = 'staticfiles'

したがって、コマンドを実行すると:

python manage.py collectstatic   

ルートレベルでstaticfilesというフォルダーを作成します(myapp /と同じディレクトリ)

これのポイントは何ですか?すべての静的ファイルのコピーを作成するだけではありませんか?

65
user5732453

複数のアプリから静的ファイルを単一のパスに収集します

さて、単一のDjangoprojectは複数のappsしたがって、myappは1つしかありませんが、実際にはmyapp1myapp2などになります。

個々のアプリ内からそれらを単一のフォルダーにコピーすることにより、フロントエンドWebサーバー(nginxなど)をその単一のフォルダーSTATIC_ROOTに向け、静的なファイルを単一の場所から提供するように設定できます。複数のパスからの静的ファイル。

ManifestStaticFilesStorage を使用した永続URL

バージョン管理のためにファイル名に追加されるMD5ハッシュに関する注意:settings.STATICFILES_STORAGEcollectstaticにデフォルト設定されるため、StaticFilesStorageのデフォルト動作の一部ではありません(これは行われません)

MD5ハッシュは、たとえばManifestStaticFilesStorageを使用するように設定した場合、その動作を広告します。

このストレージの目的は、いくつかのページがまだそれらのファイルを参照している場合に古いファイルを提供し続けることです。それらはあなたまたはサードパーティのプロキシサーバーによってキャッシュされるためです。さらに、展開されたファイルに遠い将来のExpiresヘッダーを適用して、後続のページアクセスのロード時間を短縮したい場合にも非常に役立ちます。

55
bakkal

Djangoの静的ファイルは多くの場所に配置できます。 /static/img/icon.pngとして提供されるファイルは、 多くの場所から来る です。デフォルトでは:

  • FileSystemFinderは、img/icon.pngのそれぞれでSTATICFILES_DIRSを探します。
  • AppDirectoriesFinderは、img/icon.pngのそれぞれのstaticサブフォルダーでINSTALLED_APPSを探します。これにより、Django Adminなどのライブラリが独自の静的ファイルをアプリに追加できます。

現在:これは、DEBUG = 1でmanage.py runserverを実行した場合にのみ機能します。ライブに移行すると、Djangoプロセスは静的アセットを提供しなくなります。これらにサービスを提供するためにDjangoを使用するのは非効率的です。そのための特別なツールがさらにあります。

代わりに、次のようにする必要があります。

  • すべてのアプリからすべての静的ファイルを見つける
  • それらすべてを含む単一のディレクトリを構築する
  • それらをどこかにアップロードします(Webサーバーまたはサードパーティのファイルストレージのどこかにstaticディレクトリ)
  • webサーバー(nginxなど)を設定して、そのディレクトリから/static/*を直接提供し、他の要求をDjangoにリダイレクトします。

collectstaticは、このディレクトリを準備する既製のスクリプトであるため、展開スクリプトに直接接続できます。

33
Kos

実稼働インストールでは、永続URLが必要です。ファイルの内容が変更されない限り、URLは変更されません。

これは、クライアントがDjangoからWebページを開くときに、コンピューターに誤ったバージョンのCSSまたはJSファイルを保持することを防ぐためです。 Django staticfilesはファイルの変更を検出し、それに応じてURLを更新します。これにより、CSSまたはJSファイルが変更された場合、Webブラウザーは新しいバージョンをダウンロードします。

これは通常、collectstaticの実行中にファイル名にMD5ハッシュを追加することで実現されます。

編集:複数のアプリに関連する回答も参照してください。

21
Mikko Ohtamaa

サイト内に複数のDjangoアプリがある場合に便利です。

collectstaticは、すべてのアプリから静的ファイルを1か所で収集します。これにより、運用環境で提供できるようになります。

6
aa333