staticfilesアプリ—Djangoドキュメント

提供:Dev Guides
< DjangoDjango/docs/3.2.x/ref/contrib/staticfiles
移動先:案内検索

staticfilesアプリ

django.contrib.staticfilesは、各アプリケーション(および指定したその他の場所)から静的ファイルを1つの場所に収集し、本番環境で簡単に提供できるようにします。

も参照してください

静的ファイルアプリの概要といくつかの使用例については、を参照してください。 静的ファイルの管理(例: 画像、JavaScript、CSS) 。 静的ファイルの展開に関するガイドラインについては、静的ファイルの展開を参照してください。


管理コマンド

django.contrib.staticfilesは、3つの管理コマンドを公開します。

collectstatic

静的ファイルを:setting: `STATIC_ROOT` に収集します。

重複するファイル名は、デフォルトでは、テンプレート解決の動作と同様の方法で解決されます。指定された場所の1つで最初に見つかったファイルが使用されます。 混乱している場合は、:djadmin: `findstatic` コマンドを使用すると、見つかったファイルを確認できます。

後続のcollectstaticの実行時に(STATIC_ROOTが空でない場合)、ファイルは、STATIC_ROOTのファイルのタイムスタンプよりも大きい変更されたタイムスタンプがある場合にのみコピーされます。 したがって、:setting: `INSTALLED_APPS` からアプリケーションを削除する場合は、古い静的ファイルを削除するためにcollectstatic --clearオプションを使用することをお勧めします。

ファイルはを使用して検索されます :setting: `有効なファインダー ` 。 デフォルトでは、:setting: `STATICFILES_DIRS` で定義されているすべての場所と、:setting:` INSTALLED_APPS` 設定で指定されたアプリの'static'ディレクトリを検索します。 。

:djadmin: `collectstatic` 管理コマンドは、実行のたびに:setting:` STATICFILES_STORAGE`post_process()メソッドを呼び出し、パスのリストを渡します。管理コマンドによって検出されたもの。 また、:djadmin: `collectstatic` のすべてのコマンドラインオプションを受け取ります。 これは、デフォルトで ManifestStaticFilesStorage によって使用されます。

デフォルトでは、収集されたファイルは:setting: `FILE_UPLOAD_PERMISSIONS` からアクセス許可を受け取り、収集されたディレクトリは:setting:` FILE_UPLOAD_DIRECTORY_PERMISSIONS` からアクセス許可を受け取ります。 これらのファイルやディレクトリに対して異なる権限が必要な場合は、静的ファイルストレージクラスのいずれかをサブクラス化し、file_permissions_modeおよび/またはdirectory_permissions_modeパラメータを指定できます。それぞれ。 例えば:

from django.contrib.staticfiles import storage

class MyStaticFilesStorage(storage.StaticFilesStorage):
    def __init__(self, *args, **kwargs):
        kwargs['file_permissions_mode'] = 0o640
        kwargs['directory_permissions_mode'] = 0o760
        super().__init__(*args, **kwargs)

次に、:setting: `STATICFILES_STORAGE` 設定を'path.to.MyStaticFilesStorage'に設定します。

一般的に使用されるオプションは次のとおりです。

オプションの完全なリストについては、以下を実行してコマンド自身のヘルプを参照してください。

無視されたパターンリストのカスタマイズ

デフォルトの無視されたパターンリスト['CVS', '.*', '*~']は、collectstaticの呼び出しごとに--ignoreコマンドオプションを提供するよりも永続的な方法でカスタマイズできます。 カスタム AppConfig クラスを提供し、このクラスのignore_patterns属性をオーバーライドして、'django.contrib.staticfiles':setting: `INSTALLED_APPS` のそのクラスパスに置き換えます。設定:

from django.contrib.staticfiles.apps import StaticFilesConfig

class MyStaticFilesConfig(StaticFilesConfig):
    ignore_patterns = [...]  # your custom ignore list

findstatic

有効なファインダーを使用して、1つ以上の相対パスを検索します。

例えば:

デフォルトでは、一致するすべての場所が検索されます。 各相対パスの最初の一致のみを返すには、--firstオプションを使用します。

これはデバッグ支援です。 特定のパスに対して収集される静的ファイルが正確に表示されます。

--verbosityフラグを0に設定すると、余分な出力を抑制して、パス名を取得するだけで済みます。

一方、--verbosityフラグを2に設定すると、検索されたすべてのディレクトリを取得できます。


runserver

コアをオーバーライドします :djadmin: `runserver` コマンドの場合staticfilesアプリは :setting: `インストール済み ` 静的ファイルの自動配信を追加します。 ファイルの提供は:setting: `MIDDLEWARE` を介して実行されません。

このコマンドは、次のオプションを追加します。

--nostaticオプションを使用して、 staticfiles アプリでの静的ファイルの提供を完全に無効にします。 このオプションは、 staticfiles アプリがプロジェクトの:setting: `INSTALLED_APPS` 設定にある場合にのみ使用できます。

使用例:

:setting: `DEBUG` 設定がFalseの場合でも、--insecureオプションを使用して、 staticfiles アプリで静的ファイルを強制的に提供します。 これを使用することにより、非常に非効率的であり、おそらく安全でないであるという事実を認めます。 これはローカル開発のみを目的としており、を本番環境で使用しないでください。また、 staticfiles アプリがプロジェクトの:setting: `INSTALLED_APPS` にある場合にのみ使用できます。設定。

--insecureManifestStaticFilesStorage では機能しません。

使用例:


ストレージ

StaticFilesStorage

class storage.StaticFilesStorage

:setting: `STATIC_ROOT` 設定をベースファイルシステムの場所として使用し、:setting:` STATIC_URL` 設定を使用する、 FileSystemStorage ストレージバックエンドのサブクラスそれぞれベースURLとして。

storage.StaticFilesStorage.post_process(paths, **options)

このメソッドがストレージで定義されている場合、実行のたびに:djadmin: `collectstatic` 管理コマンドによって呼び出され、見つかったファイルのローカルストレージとパスが辞書として渡されます。ラインオプション。 original_path, processed_path, processedの3つの値のタプルが生成されます。 パス値は文字列であり、processedは、値が後処理されたかどうかを示すブール値、または後処理が失敗した場合の例外です。

ManifestStaticFilesStorage は、これをバックグラウンドで使用して、パスをハッシュされた対応するパスに置き換え、キャッシュを適切に更新します。


ManifestStaticFilesStorage

class storage.ManifestStaticFilesStorage

StaticFilesStorage ストレージバックエンドのサブクラス。ファイルのコンテンツのMD5ハッシュをファイル名に追加することにより、処理するファイル名を格納します。 たとえば、ファイルcss/styles.csscss/styles.55e7cbb9ba48.cssとして保存されます。

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

ストレージバックエンドは、他の保存ファイルと一致する保存ファイルで見つかったパスを、キャッシュされたコピーのパスに自動的に置き換えます( post_process()メソッドを使用)。 これらのパスを見つけるために使用される正規表現(django.contrib.staticfiles.storage.HashedFilesMixin.patterns)は、デフォルトで @import ルールとカスケードスタイルシートurl()ステートメントをカバーします。 。 たとえば、コンテンツを含む'css/styles.css'ファイル

@import url("../admin/css/base.css");

ManifestStaticFilesStorageストレージバックエンドの url()メソッドを呼び出すことで置き換えられ、最終的に'css/styles.55e7cbb9ba48.css'ファイルを次の内容で保存します。

@import url("../admin/css/base.27e20196a850.css");
storage.ManifestStaticFilesStorage.max_post_process_passes

静的ファイルは、パスを置き換える必要がある他の静的ファイルを参照する可能性があるため、ファイルハッシュが収束するまで、パスを置き換える複数のパスが必要になる場合があります。 ハッシュが収束しないことによる無限ループを防ぐために(たとえば、'foo.css''foo.css'を参照する'bar.css'を参照する場合)、後処理が破棄されるまでのパスの最大数があります。 。 参照の数が多い場合は、より多くのパスが必要になる可能性があります。 ManifestStaticFilesStorageをサブクラス化し、max_post_process_passes属性を設定して、パスの最大数を増やします。 デフォルトは5です。

ManifestStaticFilesStorageを有効にするには、次の要件が満たされていることを確認する必要があります。

MD5ハッシュの作成は、実行時にWebサイトのパフォーマンスに負担をかける可能性があるため、staticfilesは、処理されたすべてのファイルのハッシュ名を含むマッピングをstaticfiles.jsonというファイルに自動的に保存します。 これは、:djadmin: `collectstatic` 管理コマンドを実行したときに1回発生します。

storage.ManifestStaticFilesStorage.manifest_strict

実行時にstaticfiles.jsonマニフェストにファイルが見つからない場合、ValueErrorが発生します。 この動作は、ManifestStaticFilesStorageをサブクラス化し、manifest_strict属性をFalseに設定することで無効にできます。存在しないパスは変更されません。

:djadmin: `collectstatic` を実行する必要があるため、collectstaticは通常のテストセットアップの一部として実行されないため、通常、テストの実行時にはこのストレージを使用しないでください。 テスト中に、:setting: `STATICFILES_STORAGE` 設定が'django.contrib.staticfiles.storage.StaticFilesStorage'(デフォルト)のような他の設定に設定されていることを確認します。

storage.ManifestStaticFilesStorage.file_hash(name, content=None)

ファイルのハッシュ名を作成するときに使用されるメソッド。 指定されたファイル名とコンテンツのハッシュを返す必要があります。 デフォルトでは、上記のようにコンテンツのチャンクからMD5ハッシュを計算します。 独自のハッシュアルゴリズムを使用するには、このメソッドを自由にオーバーライドしてください。


ManifestFilesMixin

class storage.ManifestFilesMixin

このミックスインをカスタムストレージと一緒に使用して、 ManifestStaticFilesStorage と同様に、ファイルのコンテンツのMD5ハッシュをファイル名に追加します。


ファインダーモジュール

staticfilesファインダーには、ファインダーが検索したディレクトリパスのリストであるsearched_locations属性があります。 使用例:

from django.contrib.staticfiles import finders

result = finders.find('css/base.css')
searched_locations = finders.searched_locations

その他のヘルパー

staticfiles アプリの外部には、静的ファイルを操作するためのヘルパーがいくつかあります。

静的ファイル開発ビュー

静的ファイルツールは主に、静的ファイルを本番環境に正常にデプロイするのに役立つように設計されています。 これは通常、個別の専用静的ファイルサーバーを意味し、ローカルで開発するときに混乱する多くのオーバーヘッドがあります。 したがって、staticfilesアプリには、開発中にローカルでファイルを提供するために使用できるクイックでダーティなヘルパービューが付属しています。

views.serve(request, path)

このビュー関数は、開発中の静的ファイルを提供します。

警告

このビューは、:setting: `DEBUG`Trueの場合にのみ機能します。

これは、このビューが非常に非効率的であり、おそらく安全でないであるためです。 これはローカル開発のみを目的としており、本番環境で使用しないでください


ノート

提供されるファイルのコンテンツタイプを推測するために、このビューは、Python標準ライブラリのmimetypesモジュールに依存しています。このモジュール自体は、基盤となるプラットフォームのマップファイルに依存しています。 このビューが特定のファイルに対して適切なコンテンツタイプを返さない場合は、プラットフォームのマップファイルが正しくないか、更新する必要がある可能性があります。 これは、たとえば、RedHatディストリビューションのmailcapパッケージ、Debianディストリビューションのmime-supportをインストールまたは更新するか、HKEY_CLASSES_ROOTの下のキーを編集することで実現できます。 Windowsレジストリ。


このビューは、:djadmin: `runserver`:setting:` DEBUG` 設定がTrueに設定されている)によって自動的に有効になります。 別のローカル開発サーバーでビューを使用するには、プライマリURL構成の最後に次のスニペットを追加します。

from django.conf import settings
from django.contrib.staticfiles import views
from django.urls import re_path

if settings.DEBUG:
    urlpatterns += [
        re_path(r'^static/(?P<path>.*)$', views.serve),
    ]

パターンの先頭(r'^static/')は、:setting: `STATIC_URL` 設定である必要があることに注意してください。

これは少し厄介なので、これを行うヘルパー関数もあります。

urls.staticfiles_urlpatterns()

これにより、静的ファイルを提供するための適切なURLパターンが定義済みのパターンリストに返されます。 次のように使用します。

from django.contrib.staticfiles.urls import staticfiles_urlpatterns

# ... the rest of your URLconf here ...

urlpatterns += staticfiles_urlpatterns()

これにより、:setting: `STATIC_URL` 設定が検査され、それに応じて静的ファイルを提供するようにビューが接続されます。 :setting: `STATICFILES_DIRS` 設定を適切に設定して、django.contrib.staticfilesにアプリディレクトリ内のファイルに加えてファイルを探す場所を知らせることを忘れないでください。

警告

このヘルパー関数は、:setting: `DEBUG`Trueであり、:setting:` STATIC_URL` 設定が空でも、次のような完全なURLでもない場合にのみ機能します。 http://static.example.com/

これは、このビューが非常に非効率的であり、おそらく安全でないであるためです。 これはローカル開発のみを目的としており、本番環境で使用しないでください


「ライブテスト」をサポートするための専用テストケース

class testing.StaticLiveServerTestCase

このユニットテストTestCaseサブクラスは、 django.test.LiveServerTestCase を拡張します。

親と同じように、テスト対象のコードを実行し、HTTPを介してテストツールで使用するテストを作成するために使用できます(例: Selenium、PhantomJSなど)。そのため、静的アセットも公開する必要があります。

ただし、上記の django.contrib.staticfiles.views.serve()ビューを利用しているため、テスト実行時にstaticfilesによって提供されるアセットを透過的にオーバーレイできます。 ]ファインダー。 これは、テストセットアップの前または一部として:djadmin: `collectstatic` を実行する必要がないことを意味します。