3
2

Djangoで処理を定期的に実行する

Last updated at Posted at 2024-07-19

はじめに

こんにちは、Python初心者のkeitaMaxです。

今回はDjangoで処理を定期的に実行するようにしたいと思います。

前回の記事はこちら

APSchedulerのインストール

最後にバッチを作成するために、コマンドを定期的に叩けるようにしようと思います。

APSchedulerを以下コマンドでインストールします。

pip install apscheduler

また、docker/app/requirements.txtapschedulerを追加しておきます。

docker/app/requirements.txt
Django==5.0

mysqlclient
apscheduler

設定

インストールできたら、app/settings.pyに以下を追加します。

app/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'batch',
    'batch.apps.AppConfig', #追加
]

batch/apps.pyに以下を追加します。

batch/apps.py
from django.apps import AppConfig


class BatchConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'batch'

    def ready(self): #追加
        from .management.commands.example_batch import start #追加
        start() #追加
        

これを設定すると、runserverを実行時に読み込まれるらしいです。

batch/management/commands/example_batch.pyを作成します。

batch/management/commands/example_batch.py
from apscheduler.schedulers.background import BackgroundScheduler

def example(self, *args, **options):
    print("Hello, World!")

def start():
    scheduler = BackgroundScheduler()
    scheduler.add_job(example, 'interval', seconds=5)
    scheduler.start()

これで設定完了です。

実際に確認してみる

手動で起動させるために、
docker-compose.ymlcommand: python3 manage.py runserver 0.0.0.0:8000をコメントアウトします。

docker-compose.yml
services:
  app:
    build:
      context: ./docker/app
      dockerfile: Dockerfile
    # command: python3 manage.py runserver 0.0.0.0:8000
    ports:
      - "8000:8000"
    volumes:
      - ./src/:/code
    tty: true

その後以下コマンドでDockerを立ち上げ直します。

docker compose stop 
docker compose build
docker compose up -d  

コンテナに入り、サーバを起動させます。

docker compose exec app bash
python3 manage.py runserver 0.0.0.0:8000

すると下の画像のように、定期的に実行されていることが確認できました。

スクリーンショット 2024-07-18 20.28.36.png

最後にdocker-compose.ymlのコメントアウトは外しておきましょう。

おわりに

途中何度かつまづきましたが、なんとか定期実行できるようになりました。

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました!

参考

次の記事

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2