はじめに
こんにちは、Python初心者のkeitaMaxです。
今回はDjangoで処理を定期的に実行するようにしたいと思います。
前回の記事はこちら
APSchedulerのインストール
最後にバッチを作成するために、コマンドを定期的に叩けるようにしようと思います。
APScheduler
を以下コマンドでインストールします。
pip install apscheduler
また、docker/app/requirements.txt
にapscheduler
を追加しておきます。
Django==5.0
mysqlclient
apscheduler
設定
インストールできたら、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
に以下を追加します。
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
を作成します。
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.yml
のcommand: python3 manage.py runserver 0.0.0.0:8000
をコメントアウトします。
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
すると下の画像のように、定期的に実行されていることが確認できました。
最後にdocker-compose.yml
のコメントアウトは外しておきましょう。
おわりに
途中何度かつまづきましたが、なんとか定期実行できるようになりました。
この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。
最後まで読んでいただきありがとうございました!
参考
次の記事