スタティックファイルの利用

一般的に、ウェブサイトにはデータベースからデータを読むなりして動的にコンテンツが生成されるものと、 画像、CSS、JavaScript などのようにファイルとして配置したらそのままクライアントに提供されるものがあります。

後者のようにファイルとして配置して、そのままクライアントに送信されるファイルをスタティックファイルとか静的ファイルなどといいます。

ここでは Django でスタティックファイルを利用する方法を説明します。

開発環境

まずは開発環境でのスタティックファイルの取扱いについて説明します。

ここで開発環境というのは、settings.py にて DEBUG = True としている場合です。 実際の運用時にはデバッグモードは False にします。

static ディレクトリ

Django プロジェクトのデフォルト状態では、/static/ というパスでスタティックファイルを提供するように設定されています。

プロジェクトを作成したときに生成される settings.py では次のように設定されています。

...
INSTALLED_APPS = [
  ...
  'django.contrib.staticfiles',
]
...
STATIC_URL = '/static/'

INSTALLED_APPS に含まれる django.contrib.staticfiles アプリケーションがスタティックファイルを処理します。 そして、スタティックファイルの URL として /static/ が登録されています。

これを利用するためには、まずアプリケーションディレクトリ内に static という名前のディレクトリを作成します。

そしてさらに、そのディレクトリ内にアプリケーション名のディレクトリを作成します。

$ mkdir static
$ cd static
$ mkdir myapp1

アプリケーションディレクトリ内のフォルダ構造は次のようにします。

$ tree -I '__pycache__' -d .
.
├── static
│   └── myapp1
└── templates
    └── myapp1

このようにアプリケーション毎に static ディレクトリを作成し、その中にアプリケーション名のあるパスを作ることで、 ひとつのプロジェクト内に複数の Django アプリケーションが存在しても、スタティックファイルが正しく区別できるようになります。

上記のようにして、テンプレートからは次のように画像ファイルをハードコードして参照できます。

{% extends "myapp1/base.html" %}
{% block content1 %}
<h1>Hello, static files!</h1>
<p><img src="/static/myapp1/image1.jpg" alt=""/></p>
{% endblock %}

あるいは、次のように static テンプレートタグによって記述しておきます。

{% extends "myapp1/base.html" %}
{% load static %}
{% block content1 %}
<h1>Hello, static files!</h1>
<p><img src="{% static "myapp1/image1.jpg" %}" alt=""/></p>
{% endblock %}

詳細は後述しますが、運用のことを考えなるべく static タグでパスを記述しておきましょう。

運用時

運用時のスタティックファイルの取扱い方法について説明します。

運用時には settings.pyDEBUG = False とします。

運用時には、スタティックファイルはなるべくパフォーマンスが良くなるように、アプリケーションを介さずに ウェブサーバーから直接返すとか、あるいは CDN などの別サーバーから返すことなどが行われます。

Django は様々な状況に対応できますが、ここではもっともシンプルな方法を紹介します。

まず、settings.py 内の STATIC_ROOT で、デプロイ用の任意の物理パスを指定します。

STATIC_ROOT = '/home/user1/foo/static/'

そこで次のコマンドを実行します。

$ python manage.py collectstatic

するとこのプロジェクトに関わるスタティックファイルがかき集められて、STATIC_ROOT で指定したディレクトリにコピーされます。

次に、これらのファイルをファイルを配信するウェブサーバー上にコピーし、それらの URL を STATIC_URL に設定します。

STATIC_URL = 'http://<hostname>/static/'

テンプレート内で static タグで書いた箇所はこの URL に置き換えられます。

以上で、開発時、運用時のスタティックファイルの取扱い方法について説明しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Python 入門