静的ファイルの管理(例: 画像、JavaScript、CSS)—Djangoドキュメント
静的ファイルの管理(例: 画像、JavaScript、CSS)
Webサイトは通常、画像、JavaScript、CSSなどの追加ファイルを提供する必要があります。 Djangoでは、これらのファイルを「静的ファイル」と呼びます。 Djangoは、それらの管理に役立つ django.contrib.staticfiles を提供しています。
このページでは、これらの静的ファイルを提供する方法について説明します。
静的ファイルの構成
django.contrib.staticfiles
が:setting: `INSTALLED_APPS` に含まれていることを確認してください。設定ファイルで、:setting: `STATIC_URL` を定義します。次に例を示します。
STATIC_URL = '/static/'
テンプレートで、:ttag: `static` テンプレートタグを使用して、構成済みの:setting:` STATICFILES_STORAGE` を使用して指定された相対パスのURLを作成します。
{% load static %} <img src="{% static "my_app/example.jpg" %}" alt="My image">
アプリの
static
というフォルダーに静的ファイルを保存します。 たとえば、my_app/static/my_app/example.jpg
。
ファイルの提供
これらの構成手順に加えて、静的ファイルを実際に提供する必要もあります。
開発中に django.contrib.staticfiles を使用すると、:setting: `DEBUG` がTrue
に設定します( django.contrib.staticfiles.views.serve()を参照)。
この方法は非常に非効率的であり、おそらく安全ではないため、本番環境には適していません。
実稼働環境で静的ファイルを提供するための適切な戦略については、静的ファイルのデプロイを参照してください。
プロジェクトには、特定のアプリに関連付けられていない静的アセットも含まれている可能性があります。 アプリ内でstatic/
ディレクトリを使用することに加えて、Djangoが静的ファイルも検索する設定ファイルでディレクトリのリスト(:setting: `STATICFILES_DIRS` )を定義できます。 例えば:
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
'/var/www/static/',
]
staticfiles
がファイルを検索する方法の詳細については、:setting: `STATICFILES_FINDERS` 設定のドキュメントを参照してください。
静的ファイルの名前空間
これで、静的ファイルをmy_app/static/
に直接配置することで可能性があります(別のmy_app
サブディレクトリを作成するのではなく)が、実際には悪い考えです。 Djangoは、名前が一致する最初の静的ファイルを使用します。異なるアプリケーションに同じ名前の静的ファイルがある場合、Djangoはそれらを区別できません。 Djangoを正しいものに向けることができる必要があります。これを確実にする最良の方法は、名前空間を使用することです。 つまり、これらの静的ファイルを、アプリケーション自体にちなんで名付けられた別のディレクトリ内に配置します。
プレフィックスを指定することにより、:setting: `STATICFILES_DIRS` で静的アセットに名前空間を付けることができます。
開発中の静的ファイルの提供
上で説明したように django.contrib.staticfiles を使用する場合、:setting: `DEBUG` がに設定されていると、:djadmin:` runserver` はこれを自動的に行いますTrue
。 :setting: `INSTALLED_APPS` にdjango.contrib.staticfiles
がない場合でも、 django.views.static.serve()を使用して静的ファイルを手動で提供できます見る。
これは実稼働での使用には適していません! 一般的な展開戦略については、静的ファイルの展開を参照してください。
たとえば、:setting: `STATIC_URL` が/static/
として定義されている場合、次のスニペットをurls.pyに追加することでこれを行うことができます。
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
ノート
このヘルパー関数は、デバッグモードで、指定されたプレフィックスがローカルである場合にのみ機能します(例: /static/
)であり、URLではありません(例: http://static.example.com/
)。
また、このヘルパー関数は、実際の:setting: `STATIC_ROOT` フォルダーのみを提供します。 django.contrib.staticfiles のような静的ファイルの検出は実行しません。
開発中にユーザーがアップロードしたファイルを提供する
開発中に、 django.views.static.serve()ビューを使用して、:setting: `MEDIA_ROOT` からユーザーがアップロードしたメディアファイルを提供できます。
これは実稼働での使用には適していません! 一般的な展開戦略については、静的ファイルの展開を参照してください。
たとえば、:setting: `MEDIA_URL` が/media/
として定義されている場合、次のスニペットをurls.pyに追加することでこれを行うことができます。
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
ノート
このヘルパー関数は、デバッグモードで、指定されたプレフィックスがローカルである場合にのみ機能します(例: /media/
)であり、URLではありません(例: http://media.example.com/
)。
テスト
組み込みのテストクライアントの代わりに実際のHTTPリクエストを使用するテストを実行する場合(つまり、 組み込みの LiveServerTestCase )を使用する場合、静的アセットを残りのコンテンツに沿って提供する必要があるため、テスト環境は実際のアセットを可能な限り忠実に再現しますが、LiveServerTestCase
には非常に基本的な静的ファイル提供機能:staticfiles
アプリケーションのファインダー機能については認識せず、静的コンテンツが:setting: `STATIC_ROOT` で既に収集されていることを前提としています。
このため、staticfiles
は独自の django.contrib.staticfiles.testing.StaticLiveServerTestCase を出荷します。これは、組み込みのサブクラスであり、これらのテストは、DEBUG = True
を使用して開発時に取得するものと非常によく似た方法で行われます。 最初に:djadmin: `collectstatic` を使用してそれらを収集する必要はありません。
展開
django.contrib.staticfiles は、静的ファイルを1つのディレクトリに収集するための便利な管理コマンドを提供するため、簡単に提供できます。
:setting: `STATIC_ROOT` 設定を、これらのファイルを提供するディレクトリに設定します。次に例を示します。
STATIC_ROOT = "/var/www/example.com/static/"
:djadmin: `collectstatic` 管理コマンドを実行します。
$ python manage.py collectstatic
これにより、すべてのファイルが静的フォルダから:setting: `STATIC_ROOT` ディレクトリにコピーされます。
選択したWebサーバーを使用してファイルを提供します。 静的ファイルの展開は、静的ファイルのいくつかの一般的な展開戦略をカバーしています。
もっと詳しく知る
このドキュメントでは、基本といくつかの一般的な使用パターンについて説明しました。 django.contrib.staticfiles に含まれるすべての設定、コマンド、テンプレートタグ、およびその他の要素の詳細については、 staticfilesリファレンスを参照してください。