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

ウェブサイトではふつう、画像や JavaScript、CSS などの追加のファイルを配信する必要があります。Django では、こうしたファイルのことを「静的ファイル (static files)」と呼んでいます。静的ファイルの管理を簡単にするために、Django は django.contrib.staticfiles を提供しています。

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

静的ファイルの設定

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

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

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

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

ファイルを配信する

これらの設定の手順に加えて、実際に静的ファイルを配信する必要があります。

開発中に django.contrib.staticfiles を使用する場合には、DEBUGTrue に設定して runserver を実行すれば、自動的に設定が行われます。(詳しくは、django.contrib.staticfiles.views.serve() を参照)

ただし、この方法は 極めて非効率 であり、セキュリティ上の問題がある 可能性が高いため、本番環境で使うべきではありません

本番環境で静的ファイルを配信するための適切な戦略については、静的ファイルをデプロイする を読んでください。

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

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

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

静的ファイルの名前空間

静的ファイルを(別の my_app サブディレクトリを作成するのではなく)直接 my_app/static/ に配置することも 可能 ですが、実際にはそれは良くない考えです。Djangoは、名前が一致する最初の静的ファイルを使用します。もし 異なる アプリケーションに同じ名前の静的ファイルがあった場合、Djangoはそれらを区別できません。正しいファイルをDjangoに指定する必要があります。これを保証する最善の方法は、それらを 名前空間化 することです。つまり、アプリケーション自体の名前で命名された 別の ディレクトリ内に静的ファイルを配置することです。

STATICFILES_DIRSプレフィックス を指定することで、静的アセットの名前空間を指定できます。

開発時の静的ファイルの取扱い

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

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

例えば、 STATIC_URLstatic/ として定義されている場合、これを行うには 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)

注釈

このヘルパー関数はデバッグモードでのみ動作し、与えられた接頭辞が URL (http://static.example.com/ など) ではなくローカル (static/ など) の場合にのみ動作します。

またこのヘルパー関数は STATIC_ROOT のフォルダのみを利用します; django.contrib.staticfiles のように静的ファイルの探索は行いません。

最後に、静的ファイルはWSGIアプリケーション層のラッパーを介して提供されます。結果として、静的ファイルのリクエストは通常の ミドルウェアチェイン を通りません。

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

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

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

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

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)

注釈

このヘルパー関数はデバッグモードでのみ動作し、与えられたプレフィックスがURL (http://media.example.com/ など) ではなくローカル (media/ など) の場合にのみ動作します。

テスト

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

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

デプロイ

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

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

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

    $ python manage.py collectstatic
    

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

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

さらに学ぶ

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

Back to Top