【Django】定期処理・バックグラウンド実行・バッチ処理ができるカスタムコマンド

時計 2020.09.19 / 時計

【Django】定期処理・バックグラウンド実行・バッチ処理ができるカスタムコマンド

Djangoにはインストール時から使用できるコマンドラインツールが多くあります。

IT用語の確認

コマンドラインツールとは、Windowsでいうコマンドプロンプトのような黒い画面から、ツールを起動・実行できるプログラムです

Djangoを使用している人であれば、python manage.py runserver(開発サーバーの起動)を知らない人はいないでしょう。

そのほかでmanage.pyの後に続くコマンドでは、startapp(アプリケーション作成)、createsuperuser(管理者アカウントの作成)、makemigration(マイグレーションの作成)、migrate(マイグレートの実施)をほとんどの方がDjangoで使っているはずです。

manage.pyのコマンドラインツールの一覧を見たい方は、python manage.pyだけを実行すれば、一覧が表示されます。

実はそれらのコマンド以外でも自作したコマンドをmanage.pyの後に入力して、別の操作をすることができるようになります。
この作成したコマンドをカスタムコマンドと呼びます。

Djangoで複雑な処理を行いたい人は、このカスタムコマンドを知ることは重要です。

この機能を使って、バックグラウンドで別のプログラムを常時起動させたり、もしくはあるプログラムをコマンドラインから起動させたり(メール配信とか)、定期的なバッチ処理、定期的に起動させてデータベース内容を更新する等ができます。

本記事の対象者

本記事は以下に該当する方向けの内容となっています。
と言っていますが、興味がある方全員が対象です。

対象者

Python学習者(初級~中級者)

Djangoでバックグラウンドでプログラムを走らせたい

定期的に行う処理を自動化したい

とりあえずDjangoでできることを知りたい

本記事ではpythonフォルダ内にofficeプロジェクト、fiveアプリケーションを作成している状況で説明を進めていきます。

読者の方は、ご自身のDjango環境に照らし合わせて読んでください。

python
├── five
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
├── office
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── myvenv
  └── ...

カスタムコマンドの作成

以下にカスタムコマンド作成の流れを示します。

1.managementフォルダの作成

Djangoで作成したアプリケーションフォルダ内にmanagementフォルダを以下のように作成します。

また作成したmanagementフォルダ内には空の__init__.pyファイルを作成します。

python
├── five
│   ├──management  #追加
│   │   └──__init__.py  #追加
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
├── office
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── myvenv
  └── ...

2.commandsフォルダの作成

作成したmanagementフォルダ内にcommandsフォルダを作成します。

ここでもmanagementフォルダと同様に空の__init__.pyファイルを作成します。

python
├── five
│   ├── management
│   │   │──__init__.py
│   │   └── commands  #追加
│   │         └── __init__.py  #追加
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
├── office
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── myvenv
  └── ...

3.カスタムコマンド用pyファイルを作成

commandsフォルダ内にカスタムコマンド用のPythonファイルを作成します。

このPythonファイルの名前が、manage.pyの後に入力するコマンド名となります。

ここでは「office54.py」というファイル名で作成します。

python
├── five
│   ├── management
│   │   │──__init__.py
│   │   └── commands
│   │         │── __init__.py
│   │         └── office54.py  #追加
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
├── office
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── myvenv
  └── ...

カスタムコマンド用Pythonファイルの書き方

作成したカスタムコマンド用Pythonファイルの書き方について説明していきます。

BaseCommandのインポート

カスタムコマンドを作成するには、BaseCommandクラスを継承したClassを作成する必要があります。

まず以下を先頭に記入し、BaseCommandをimportします。

from django.core.management.base import BaseCommand

モデルのインポート

作成するカスタムコマンドで使用したいモデルがある場合は、以下のように記述して対象のモデルをインポートします。

from アプリ名.models import モデル名

実行したい処理の記述

カスタムコマンドをmanage.pyで実行した際に行われるプログラムは以下のようにして記述します。

class Command(BaseCommand):
    def handle(self, *args, **options):
        実行したい処理をここに記述する

上記のようにBaseCommandを継承したClassの内部に、handleメソッドを定義して、その中に実行したい処理を記述します。

カスタムコマンドの確認

作成したカスタムコマンドが実際に追加されているか確認してみましょう。

冒頭でも説明した以下のコマンドを実行して、コマンド一覧を表示してみてください。

python manage.py

そうすると、作成したカスタムコマンドが追加されているはずです。

python manage.pyでコマンドリストの一覧表示

カスタムコマンドの実行方法

上記の方法でカスタムコマンド用Pythonファイルが作成できたら、実際に実行してみましょう。

実行方法は何度も出てきていますが、一応以下に記載しておきますね。

python manage.py カスタムコマンド用pyファイル名

これで作成したカスタムコマンドのプログラムを実行できます。

まとめ

今回紹介した方法はWebアプリケーションを作成するうえで、様々なことに応用できる技術です。

ぜひ使いこなせるようにしてください。

ちなみに私は会社でサーバーやNAS、ルーターなどの機器の死活監視を行うために使用しています。

pingでの死活監視をWEBサーバーのバックグラウンドで起動させておき、機器に異常が発生した場合、メールでの連絡とWEBサイト上で確認できるようになっています。

このような形でみなさんもバッチ処理やバックグラウンド処理などに使ってみてください。