Django 静的ファイルをアプリケーション毎に配置します。静的ファイルとは、以下のものを指しています。
- 画像 (img)
- Javascript (js)
- スタイルシート (css)
アプリケーション毎とは、startapp コマンドで作成するアプリケーションを指しています。
アプリケーション毎に静的ファイルを別ディレクトリで管理し、デプロイ時にそれを一箇所に集めます。
「それって、何が嬉しいの?」と思うかもしれませんが、アプリケーション毎に管理することによって、メンテナンス性が上がるんです。(と私は思っています。)
もう一つのやり方としては、最初から一箇所で管理する方法もありますが、私の経験上、メンテナンス性が下がります。また、Django Admin や サードパーティーの静的ファイルの取り扱いに困るので、あまりお勧めしません。
Managing static files (e.g. images, JavaScript, CSS) | Django documentation | Django
Contents
バージョン
- CentOS 7.5.1804
- Python 3.6.4
- Django 2.1.2
インストール
まずはじめに環境構築をしていきます。
Python のインストール
$ sudo yum install https://centos7.iuscommunity.org/ius-release.rpm $ sudo yum install python36u python36u-libs python36u-devel python36u-pip
Python 3 をインストールします。
Django のインストール
$ sudo pip install --upgrade django
Django をインストールします。
実装
環境構築が完了したら、次は実装をします。
startproject, startapp
$ django-admin startproject dj_static $ cd dj_static/ $ python3.6 manage.py startapp myapp1 $ python3.6 manage.py startapp myapp2
Django のコマンドを使用して、プロジェクトとアプリケーションを2つ作成します。
settings.py
INSTALLED_APPS = [ ... 'myapp1.apps.Myapp1Config', 'myapp2.apps.Myapp2Config', ] STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'static')
startproject で作成された settings.py を編集します。
ここでのポイントは、STATIC_ROOT です。アプリケーション毎の静的ファイルは、デプロイ時に collectstatic コマンドで一箇所に集めます。この時の保存先は STATIC_ROOT で指定するパスになります。
本番環境で mod_wsgi を利用する場合、Alias にこのパスを指定すれば OK です。
静的ファイルの配置
startapp でアプリケーションを2つ作成しました。それぞれに static ディレクトリを作成し、css ファイルを作成します。
myapp1.css
$ mkdir -p myapp1/static/myapp1/css $ touch myapp1/static/myapp1/css/myapp1.css
myapp2.css
$ mkdir -p myapp2/static/myapp2/css $ touch myapp2/static/myapp2/css/myapp2.css
tree
$ tree . |-- dj_static | |-- __init__.py | |-- settings.py | |-- static | |-- urls.py | `-- wsgi.py |-- manage.py |-- myapp1 | |-- admin.py | |-- apps.py | |-- __init__.py | |-- migrations | | `-- __init__.py | |-- models.py | |-- static | | `-- css | | `-- myapp1.css | |-- tests.py | `-- views.py `-- myapp2 |-- admin.py |-- apps.py |-- __init__.py |-- migrations | `-- __init__.py |-- models.py |-- static | `-- css | `-- myapp2.css |-- tests.py `-- views.py 10 directories, 21 files
最終的なファイル構成はこのようになりました。
動作確認
それでは動作確認をしていきます。
アプリケーション毎の静的ファイルを収集
$ python3.6 manage.py collectstatic 121 static files copied to '/home/vagrant/dj_static/static'. $ tree static/ static/ ├── admin │ ├── css ... ├── myapp1 │ └── css │ └── myapp1.css └── myapp2 └── css └── myapp2.css 18 directories, 121 files
アプリケーション毎の静的ファイルを収集するには、collectstatic コマンドを使います。
私が作成したファイルは2つだけですが、Django Admin の大量の静的ファイルも collect されました。このことから、collectstatic は settings.py の INSTALLED_APPS で定義しているアプリケーションの static を全て collect するものと思われます。
まとめ
Django 静的ファイルをアプリケーション毎に管理しました。
もちろん、このままではあまり意味がないので、テンプレートで実装したり、本番環境用にmod_wsgi に指定したりしてください。
テンプレートでの実装方法
{% load static %} <link rel="stylesheet" href="{% static 'myapp1/css/myapp1.css' %}">
mod_wsgi 指定方法
Alias /static/ /home/vagrant/dj_static/static/