静的ファイル (画像、JavaScript、CSS など) を管理するLink to this heading

Websites generally need to serve additional files such as images, JavaScript, or CSS. In Django, we refer to these files as "static files". Django provides django.contrib.staticfiles to help you manage them.

このページでは、こうした静的ファイルの配信の仕方について説明します。

静的ファイルの設定Link to this heading

  1. django.contrib.staticfiles が設定ファイルの INSTALLED_APPS に含まれていることを確認してください。

  2. 設定ファイルの中で、STATIC_URL を設定します。たとえば、次のようにします:

    Code
    STATIC_URL = "static/"
    
  3. テンプレート内では、 static テンプレートタグを使用して、staticfiles STORAGES で設定したエイリアスで相対パスの URL を生成できます。

    Django template
    {% load static %}
    <img src="{% static 'my_app/example.jpg' %}" alt="My image">
    
  4. アプリ内に static というフォルダを作成って静的ファイルを保存してください。例: my_app/static/my_app/example.jpg

プロジェクトには、特定のアプリケーションに紐付けられていない 静的な assets があることがあります。その場合には、アプリケーション内の static/ ディレクトリの他に、設定ファイルでディレクトリのリスト (STATICFILES_DIRS) を定義して、Django が静的ファイルを検索できるようにすることができます。たとえば、次のように設定します。

Code
STATICFILES_DIRS = [
    BASE_DIR / "static",
    "/var/www/static/",
]

staticfiles がファイルを探索する方法について詳しくは、 STATICFILES_FINDERS のドキュメントを参照してください。

開発時の静的ファイルの取扱いLink to this heading

上で述べたたように django.contrib.staticfiles を利用する場合、 DEBUGTrue であれば runserver は自動的にこの処理を行います。もし INSTALLED_APPS 内に django.contrib.staticfiles が存在しない場合は、手動で django.views.static.serve() ビューを用いて静的ファイルを取り扱わなければなりません。

この機能は本番環境で利用するのに適していません! 一般的なデプロイ方法に関しては 静的ファイルをデプロイする を参照ください。

例えば、 STATIC_URLstatic/ として定義されている場合、これを行うには urls.py に以下のコードを追加します:

Code
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)

開発時における、ユーザーがアップロードするファイルの取扱いLink to this heading

開発中は、ユーザーによってアップロードされたメディアファイルを django.views.static.serve() ビューを利用している MEDIA_ROOT から利用できます。

この機能は本番環境で利用するのに適していません! 一般的なデプロイ方法に関しては 静的ファイルをデプロイする を参照ください。

例えば、 MEDIA_URLmedia/ として定義されている場合、これを行うには ROOT_URLCONF に以下のコードを追加します:

Code
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)

テストLink to this heading

ビルトインのテストクライアント (たとえば、ビルトインの LiveServerTestCase) ではなく実際の HTTP リクエストを使用してテストを実行している場合、テスト環境が現実の環境をできるだけ忠実に再現できるように、他のコンテンツと同じように静的アセットも配信する必要があります。しかし、LiveServerTestCase はとても基本的な静的ファイル配信機能しかないため、staticfiles アプリケーションの探索機能はなく、すでに静的コンテンツは STATIC_ROOT に集められていることを前提にしています。

このため、 staticfiles は独自の django.contrib.staticfiles.testing.StaticLiveServerTestCase を同梱しています。これは組み込みのサブクラスで、開発時に DEBUG = True を指定した場合と非常によく似た方法で、つまり collectstatic を使って最初にアセットを収集することなく、テストの実行中にすべてのアセットを透過的に提供する機能を持っています。

デプロイLink to this heading

django.contrib.staticfiles には、静的ファイルを単一のディレクトリに集約するための便利な管理コマンドがあり、静的ファイルを簡単に配信できます。

  1. STATIC_ROOT 設定で、どのディレクトリから静的ファイルを配信するかを指定します。たとえば:

    Code
    STATIC_ROOT = "/var/www/example.com/static/"
    
  2. collectstatic 管理コマンドを実行します

    Shell
    $ python manage.py collectstatic
    

    これにより、各 static フォルダから STATIC_ROOT のディレクトリにファイルがコピーされます。

  3. お好みのWebサーバーを使用してファイルを配信してください。静的ファイルをデプロイする では、静的ファイルの一般的なデプロイ戦略をいくつか紹介しています。

さらに学ぶLink to this heading

このドキュメントでは、基本および一般的な利用パターンを紹介しました。django.contrib.staticfiles に含まれるすべての設定、コマンド、テンプレートタグ、およびその他の事項に関する網羅的な詳細は、staticfiles のリファレンス を参照してください。