django には 2 種類の「静的」ファイルがあります。
- アプリケーションにバンドルされたリソース/アセット (通常は css、javascript)
- ユーザーがアップロードしたすべてのファイル。
これらは静的ファイルの 2 つの異なるカテゴリであるため、django はそれらを処理するための 2 つのメカニズムを提供します。最初の条件は 2 番目の条件よりも一般的であるため (ユーザーにファイルのアップロードを要求するアプリケーションがない可能性があります)、最初の条件の処理は django に組み込まれています。
標準のレイアウトに従って、静的ファイルを必要とするstatic
アプリケーションは、アプリケーション ディレクトリ内で呼び出されるディレクトリにそれらを含めます。INSTALLED_APPS
Django は、静的ファイル用のアプリ内でこのディレクトリを検索します。どのアプリにも関連付けられていないファイルがある場合は、それらを別のディレクトリに配置できます。STATICFILES_DIRS
django が認識できるように、このディレクトリを (タプル) に追加する必要があります。
これが完了すると、collectstatic
コマンドはすべての静的ファイルを (static
内のすべてのアプリケーションのサブディレクトリと 内INSTALLED_APPS
の任意のディレクトリからSTATICFILES_DIRS
) 収集し、それらをSTATIC_ROOT
;が指すディレクトリに配置します。これは、{{ STATIC_URL }}
タグがテンプレートで正しく機能するためです。
STATIC_ROOT
あとは、Web からアクセスできるようにディレクトリを移動/ポイント/リンクするだけです。Django は、STATIC_ROOT
で指定されたルート URL ですべてのファイルにアクセスできることを想定していますSTATIC_URL
。
ユーザーがアップロードしたファイルの場合、django はより手間がかかりません。本当に気にするのは、ユーザーがアップロードしたファイルを、collectstatic
コマンドがファイルを読み取るために使用するのと同じ場所に置かないことです-つまり、MEDIA_ROOT
ディレクトリまたはサブディレクトリにすることはできませんSTATICFILE_DIRS
(ディレクトリを指定した場合)ここでは、通常、この設定はバニラ django セットアップでは定義されていません)。
MEDIA_ROOT
は、ルートの下にサブディレクトリを作成することで django が操作できるディレクトリです (たとえば、FileField
ドキュメントを参照してください)。
MEDIA_URL
ユーザーがアップロードしたファイルのルートを指す URL プレフィックスです。これは、モデルの自動 URL を生成するコマンドが正しく機能するようにするためです。
これらは 2 つの異なるクラスの静的ファイルであるため、セキュリティと展開の要件には 2 つの異なるタイプがあります。たとえば、ユーザーがアップロードしたファイルを S3 バケットに保存し、アプリケーションのアセットを別の場所に置きたい場合があります。
これが、これら 2 つの類似したものが django で分離されている理由です。