静的ファイル (画像、JavaScript、CSS など) を管理するLink to this heading
ウェブサイトではふつう、画像や JavaScript、CSS などの追加のファイルを配信する必要があります。Django では、こうしたファイルのことを「静的ファイル (static files)」と呼んでいます。静的ファイルの管理を簡単にするために、Django は django.contrib.staticfiles を提供しています。
このページでは、こうした静的ファイルの配信の仕方について説明します。
静的ファイルの設定Link to this heading
django.contrib.staticfilesが設定ファイルのINSTALLED_APPSに含まれていることを確認してください。設定ファイルの中で、
STATIC_URLを設定します。たとえば、次のようになります。STATIC_URL = "static/"テンプレートでは
staticテンプレートタグを使用して、設定されたstaticfilesSTORAGESエイリアスにより指定された相対パスの URL を作成します。{% load static %} <img src="{% static 'my_app/example.jpg' %}" alt="My image">アプリケーション内に
staticというフォルダを作って静的ファイルを保存してください。例えば、my_app/static/my_app/example.jpgとなります。
プロジェクトには、特定のアプリケーションに紐付けられていない 静的な assets があることがあります。その場合には、アプリケーション内の static/ ディレクトリの他に、設定ファイルでディレクトリのリスト (STATICFILES_DIRS) を定義して、Django が静的ファイルを検索できるようにすることができます。たとえば、次のように設定します。
STATICFILES_DIRS = [
BASE_DIR / "static",
"/var/www/static/",
]
staticfiles がファイルを探索する方法について詳しくは、 STATICFILES_FINDERS のドキュメントを参照してください。
開発時の静的ファイルの取扱いLink to this heading
上で述べたたように django.contrib.staticfiles を利用する場合、 DEBUG が True であれば runserver は自動的にこの処理を行います。もし INSTALLED_APPS 内に django.contrib.staticfiles が存在しない場合は、手動で django.views.static.serve() ビューを用いて静的ファイルを取り扱わなければなりません。
この機能は本番環境で利用するのに適していません! 一般的なデプロイ方法に関しては 静的ファイルをデプロイする を参照ください。
For example, if your STATIC_URL is defined as static/, you can
do this by adding the following snippet to your 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)
ユーザーによりアップロードされるファイルの開発時の取扱いLink to this heading
開発中は、ユーザーによってアップロードされたメディアファイルを django.views.static.serve() ビューを利用している MEDIA_ROOT から利用できます。
この機能は本番環境で利用するのに適していません! 一般的なデプロイ方法に関しては 静的ファイルをデプロイする を参照ください。
For example, if your MEDIA_URL is defined as media/, you can do
this by adding the following snippet to your 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)
テストLink to this heading
ビルトインのテストクライアント (たとえば、ビルトインの LiveServerTestCase) ではなく実際の HTTP リクエストを使用してテストを実行している場合、テスト環境が現実の環境をできるだけ忠実に再現できるように、他のコンテンツと同じように静的アセットも配信する必要があります。しかし、LiveServerTestCase はとても基本的な静的ファイル配信機能しかないため、staticfiles アプリケーションの探索機能はなく、すでに静的コンテンツは STATIC_ROOT に集められていることを前提にしています。
Because of this, staticfiles ships its own
django.contrib.staticfiles.testing.StaticLiveServerTestCase, a subclass
of the built-in one that has the ability to transparently serve all the assets
during execution of these tests in a way very similar to what we get at
development time with DEBUG = True, i.e. without having to collect them
using collectstatic first.
デプロイLink to this heading
django.contrib.staticfiles には、静的ファイルを単一のディレクトリに集約するための便利な管理コマンドがあるので、静的ファイルを簡単に配信することができます。
STATIC_ROOT設定で、どのディレクトリから静的ファイルを配信するかを指定します。たとえば:STATIC_ROOT = "/var/www/example.com/static/"collectstatic管理コマンドを実行します$ python manage.py collectstaticこれにより、各 static フォルダから
STATIC_ROOTのディレクトリにファイルがコピーされます。あなた自身の選択で、ファイルを配信するウェブサーバーを使用してください。静的ファイルをデプロイする で、静的ファイルに対する一般的なデプロイの戦略を紹介しています。
さらに学ぶLink to this heading
このドキュメントでは、基本および一般的な利用パターンを紹介しました。django.contrib.staticfiles に含まれるすべての設定、コマンド、テンプレートタグ、およびその他の事項に関する網羅的な詳細は、the staticfiles reference を参照してください。