カスタム Django 管理コマンドのスケジューリング
最終更新日 2021年10月18日(月)
Table of Contents
カスタム django-admin コマンドと Heroku Scheduler を使用すると、Django アプリケーションのデータまたはコードに依存する定期的なタスクを簡単に実行できます。
カスタム管理コマンドを作成する
Python ファイルを作成する
カスタム Django 管理コマンドは、Django プロジェクトのアプリ内でネストされます。このチュートリアルでは、Django プロジェクトに複数のアプリが含まれている場合、カスタム管理コマンドがどのアプリに最も密接に関連するかを判定し、そのアプリを使用して以下の手順に従います。
Django プロジェクトには 1 つ以上のアプリが含まれています。このチュートリアルでは、全体的な Django プロジェクトではなく、いずれかのアプリ内で作業します。
カスタムコマンドのコードを含む Python ファイルは、次の複数のディレクトリ内でネストされます。
- Django アプリのルートレベルに、
management
という名前のディレクトリを作成します。 management
内に、commands
ディレクトリを作成します。commands
内に、print_book_titles.py
のような名前を持つファイルを作成します。文体的に、このファイルのために選択する名前は、そのタスクが実行されたときの結果を表すようにしてください。
この段階で、アプリのファイルツリーは次のようになります。
some_app/
__init__.py
models.py
management/
commands/
print_book_titles.py
tests.py
views.py
Django は、コマンドファイルの名前を CLI で実行されるコマンド (python manage.py print_book_titles
) に自動的にマッピングします。
コマンドのロジックをコーディングする
次のコードスニペットは、短いカスタム管理コマンドのためのものです。より複雑なニーズに関するガイダンスについては、カスタム django-admin コマンドの記述に関する Django のドキュメントを参照してください。
from django.core.management.base import BaseCommand, CommandError
from some_app.models import Book
class Command(BaseCommand):
help = 'Prints all book titles in the database'
def handle(self):
try:
books = Book.objects.all()
for book in books:
self.stdout.write(self.style.SUCCESS(book.title))
except FieldDoesNotExist:
self.stdout.write(self.style.ERROR('Field "title" does not exist.'))
return
self.stdout.write(self.style.SUCCESS('Successfully printed all Book titles'))
return
Heroku Scheduler がいつシャットダウンできるかを認識できるように、handle()
関数の各論理フローの最後に return
ステートメントを含めてください。これにより、そのジョブを実行するために必要な dyno の時間に対してのみ請求されるようになります。
コマンドが期待どおりに動作することを確認する
コマンドを One-off dyno で実行して、それが動作することを確認します。
- CLI から、
heroku run bash -a your-app-name
を実行します manage.py
を含むディレクトリに移動しますpython manage.py <your_custom_command>
を実行します
Heroku Scheduler を設定する
アドオンをプロビジョニングする
Heroku Scheduler アドオンがまだ Heroku アプリにプロビジョニングされていない場合は、ここで「Heroku Scheduler - Installing the Add-On」(Heroku Scheduler - アドオンのインストール) の手順に従います。
ジョブをスケジュールする
「Heroku Scheduler - Scheduling Jobs」(Heroku Scheduler - ジョブのスケジューリング) の手順に従って Heroku Scheduler ツールを開きます。入力を求められたら、実行するコマンドとして「python manage.py <your_custom_command>
」と入力します。
manage.py
ファイルが Heroku アプリの Git リポジトリのルートレベルにない場合、Heroku Scheduler 内で実行されるコマンドは、まず manage.py
ファイルを含むディレクトリに移動する必要があります。そのコマンドは cd my-project && python manage.py <your-command-name>
のようになります。