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


92

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

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/

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

回答:


72

複数のアプリから静的ファイルを1つのパスに収集する

ええと、1つのDjangoプロジェクトが複数のアプリを使用myappする可能性があるためmyapp1、1つしかない場合でも、実際にはmyapp2、などの可能性があります。

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

ManifestStaticFilesStorageを使用した永続URL

MD5ハッシュに関する注意はバージョン管理のためにファイル名に追加された:それはのデフォルト動作の一部ではないcollectstaticとして、settings.STATICFILES_STORAGEデフォルトStaticFilesStorage(それをしません)

MD5ハッシュは、たとえば、を使用するように設定するとManifestStaticFilesStorage、その動作をアドバタイズします。

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


3
あなたは静的なコンテンツを提供するためのWebサーバーを見つけることは容易になることを言いたい
babygame0ver

46

Django静的ファイルは多くの場所に存在する可能性があります。提供されるファイルは、さまざまな場所から取得される/static/img/icon.png可能性があります。デフォルト:

  • FileSystemFinderimg/icon.pngそれぞれで探しますSTATICFILES_DIRS
  • AppDirectoriesFinder探しますimg/icon.pngstaticあなたの各サブフォルダINSTALLED_APPS。これにより、DjangoAdminなどのライブラリが独自の静的ファイルをアプリに追加できるようになります。

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

代わりに、次のようなことを行う必要があります。

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

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


25

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

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

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

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


1
いいね!それを知らなかった
doniyor 2016年

「通常はMD5ハッシュを追加することで実現されます」とは、ManifestStaticFilesStorageを意味しますか?ニース、私はそれを見ていません
コス2016年

3
デフォルトではMD5ハッシュが実行されていないと思います。これは、デフォルトがにsettings.STATICFILES_STORAGE設定されているStaticFilesStorageため、MD5は、たとえばに設定した後にのみ起動しManifestStaticFilesStorageます。正​​しいですか?
bakkal 2016年

@MikkoOhtamaaしかし、フロントエンドアプリは、リンクするファイル名が常に変更されるため、どのファイル名にリンクする必要があるかをどのように知るのでしょうか。
ラパン

@lapinいい質問です!当然、1)最新バージョンへのマッピングと2)これを伝達する方法が存在する必要があります。通常はどこかのファイルに保存されており、「Xの最新バージョンの完全なURL」と尋ねると結果が表示されます。
MikkoOhtamaa19年

10

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

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

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