【Django】定期実行する方法(APScheduler)

2022年10月19日

1時間に1回、データを取得しデータベースに保存したり、毎朝4時にデータベースの重複チェックを行いデータの整理をするなど、自動実行する方法です。

APSchedulerをインストール

APSchedulerをインストールします。

pip install apscheduler

実行したいコードを記述する

アプリフォルダの中「task」というフォルダを作成し「task.py」というファイルを作成します。

app
├ admin.py
├ models.py
├view.py
└tasks 
  └task.py

task.pyに下記の通り記述する

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

def periodic_execution():# 任意の関数名
    # ここに定期実行したい処理を記述する
    print ("定期実行")
    
        
def start():
    scheduler = BackgroundScheduler()
    scheduler.add_job(periodic_execution, 'cron', hour=8, minute=30)# 毎日23時59分に実行
    scheduler.start()

  
# 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)

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

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

アプリフォルダ内の「app.py」に下記コードを追記します。

from django.apps import AppConfig


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

これでサーバー起動中に定期実行されます。

〜was missed by・・が表示され実行失敗する

デフォルトでは予定された実行時間よりも 1 秒以上 scheduler の起動が遅れてしまった場合実行されない。

下記のように"misfire_grace_time"を追加する。

scheduler.add_job(periodic_execution, 'cron', hour=8, minute=30, misfire_grace_time=300)

Django,python

Posted by Next-k