Djangoにメンテナンスモードを導入する方法

しんぺい

こんにちは!しんぺいです。

自分で管理しているWebサービスで、少しの変更ならサービスを止めずにリリース可能ですが、システムが大きく変更されたり不具合が発生する可能性がある場合は、メンテナンスモードが欲しいですよね。

今回は、Python製のフレームワークであるDjangoに、超簡単にメンテナンスモードを導入する方法を紹介します。

django-maintenance-modeをインストールする

自分でメンテナンスモードを実装するのは手間なので、django-maintenance-modeというパッケージを導入します。

参考 django-maintenance-modegithub
$ pip install django-maintenance-mode

settings.pyで、自分が作成したアプリケーションよりも前に、maintenance_modeを追加します。

DJANGO_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'maintenance_mode',  # ←追加
    'my_app',
    ...

そのままsettings.pyで、MIDDLEWAREにmaintenance_mode.middleware.MaintenanceModeMiddlewareを追加します。

MIDDLEWARE = [
    ...,
    'maintenance_mode.middleware.MaintenanceModeMiddleware',  # ←追加
]

まだsettings.pyで、今度はTEMPLATESの中にあるcontext_processorsに、maintenance_mode.context_processors.maintenance_modeを追加します。

TEMPLATES = [
    {
        ...,
        'OPTIONS': {
            'context_processors': [
                ...,
                'maintenance_mode.context_processors.maintenance_mode',  # ←追加
            ],
        },
    },
]

今度はメンテナンスモード時のテンプレートを用意します。

Djangoの503のデフォルトテンプレートを使いますので、templatesディレクトリの中に、503.htmlを作ります。

.
└─test_django
   ├─test_django
   │  ├─templates
   │  │  ├─base.html
   │  │  └─503.html  #←追加
   │  ├─manage.py
   │  └─db.sqllite3
   └─venv

そのままでは何も表示されないので、503.htmlをカスタマイズします。

{% extends 'base.html' %}

{% block content %}
    

ただいまメンテナンス中です。

時間をおいて再度アクセスしてください。

{% endblock %}

オプションを追加する

ほとんどの準備は整いましたが、このままだと、まだ以下の問題があります。

  • 管理画面に入れなくなる
  • スーパーユーザー(管理者)もメンテナンスモードになってしまう

これでは困るので、除外するオプションを追加します。

再びsettings.pyで、一番下などに以下を追加します。

# メンテモード用
MAINTENANCE_MODE_IGNORE_ADMIN_SITE = True
MAINTENANCE_MODE_IGNORE_SUPERUSER = True

これで準備は整いました!

メンテナンスモードのONとOFFは、以下で切り替えられます。

  • http://127.0.0.1:8000/maintenance-mode/on/
  • http://127.0.0.1:8000/maintenance-mode/off/

同じブラウザでは確認できないので別のブラウザでアクセスして、用意した503のテンプレートが表示されれば完了です!