【Django】自動で処理を定期実行する方法【APScheduler】

  • Djangoで処理を定期実行するには?
  • APSchedulerの使い方とは?

本記事ではこのような疑問を解決します。


Webアプリ開発において、一定間隔orある時点において自動で処理を実行させたいシーンがあります。

例えば、一定間隔でデータベースを更新したり、ある日時になったら自動でメールを送信したり。

そして、Djangoにおいてはどのように処理の定期実行を実現するのでしょうか?


そこで今回はDjangoにおいて自動で処理を定期実行する方法を解説していきます。

APSchedulerをインストールする

まずは、処理を定期実行するためのPythonライブラリであるAPSchedulerをインストールします。

下記のコマンドを実行しましょう。

$ pip install apscheduler

※APScheduler公式ドキュメントはこちら

定期実行したい処理を記述する

次に、APSchedulerを使って、定期実行したい処理を記述していきます。

ここではアプリフォルダの中にap_scheduler.pyというファイルを作成します。

$ touch アプリ名/ap_scheduler.py

作成したap_scheduler.py内に下記の通り記述しましょう。

from datetime import datetime, date
from apscheduler.schedulers.background import BackgroundScheduler


def periodic_execution():# 任意の関数名
    # ここに定期実行したい処理を記述する

def start():
  scheduler = BackgroundScheduler()
  scheduler.add_job(periodic_execution, 'cron', hour=23, minute=59)# 毎日23時59分に実行
  scheduler.start()

ちなみに、scheduler.add_job()のところは以下のようにパターンを変えることができます。

# 5分おきに実行
scheduler.add_job(periodic_execution, 'interval', minutes=5)

# 1時間5秒おきに実行
scheduler.add_job(periodic_execution, 'interval', hours=1, seconds=5)

# 1日おきに実行
scheduler.add_job(periodic_execution, 'interval', days=1)

# 1週間おきに実行
scheduler.add_job(periodic_execution, 'interval', weeks=1)

# 2022年4月1日19時〜20時の間、1分おきに実行
scheduler.add_job(periodic_execution, 'interval', minutes=1,
    start_date="2022-04-01 19:00:00",
    end_date="2022-04-01 20:00:00")

# 毎時20分に実行
scheduler.add_job(periodic_execution, 'cron', minute=20)

# 月曜から金曜の間、22時になると実行
scheduler.add_job(periodic_execution, 'cron', hour=22, day_of_week='mon-fri')

サーバー起動中は処理が定期実行されるようにする

最後に、runserverコマンド実行時にap_scheduler.pyが動くように設定します。

アプリフォルダのapps.py内に下記の通り記述しましょう。

from django.apps import AppConfig


class AppConfig(AppConfig):
    name = 'アプリ名'
    
    # ↓こちらを追加
    def ready(self):
        from .ap_scheduler import start
        start()


settings.py内のINSTALLED_APPSに下記のコードを追加しましょう。

ただ、こちらの記述はアプリフォルダ作成時に追加されている場合がほとんどなので、すでに記述がある場合は飛ばしてOKです。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
        ...
    'アプリ名.apps.AppConfig',# ←こちらを追加
]

ここまでの手順により、サーバー起動中は処理が定期実行されます!

まとめ

以上がDjangoにおいて自動で処理を定期実行する方法になります。

思ったよりも簡単な手順ではなかったでしょうか?

本記事におけるap_scheduler.py内の記述をカスタマイズすれば、好きな処理を定期実行することができます。

ぜひ応用してみてください!

実務1年未満でもOK!フリーランスエンジニアの案件獲得方法はこちら!

必読

フリーランスエンジニアが案件獲得方法とは?自ら営業せずに案件を獲得するには?実務経験1年未満でも大丈夫なの? 本記事ではこのような疑問を解決します。これからフリーランスエンジニアとして独立したい方は、兎にも角にも案件の獲得が急務です[…]

アイキャッチ画像