Djangoでcron

Yuji Yamasaki
inet-lab
Published in
3 min readNov 6, 2019

Djangoで行っているシステム開発で,1日に1回定期処理をさせる必要が出た.

要件

1日の終わりに,1日中取得し続けているデータの処理を行う.

もちろん

pythonで適当にコードを作って直接MySQLを叩いてそれをcronで定期実行させればいいが

モデルの定義などはDjangoに入っているので,出来ればそれを利用したい

ただDjangoってWebフレームワークだし,その内のファイル1つだけ実行させるとか可能か?

といったことを解決した備忘録

選んだ方法

Djangoの新しいコマンドを定義すれば良さそう

というのも

Djangoはある程度コマンドが用意されてる

$ python3 manage.py runserver
$ python3 manage.py migrate
$ python3 manage.py makemigrations
...

これを新しく定義してcronで叩くことにした.

手順

新しいアプリケーションを作成

$ python3 manage.py startapp cron

正直既存のアプリケーションの中にコマンドの定義をしてもいいが分かりやすくするためにこうした

settings.pyに作成したアプリケーションを追加

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'cron', #これ
]

作成したアプリケーションにmanagementディレクトリ追加

$ cd cron
$ mkdir cron/management

managementディレクトリの下にcommandsディレクトリ追加

$ cd management
$ mkdir commands

commandsディレクトリの下にcron.pyを追加

$ cd management
$ vim cron.py

このcron.pyはコマンドの名前となるので,コマンドの名前をsqlにしたければsql.pyを作成すれば良い

cron.pyを編集

from django.core.management.base import BaseCommand

class Command(BaseCommand):
def handle(self, *args, **options):
for i in range(100):
print('Hello Medium! ', end='')

本来はモデルをインポートして処理させるが諸般の事情で割愛
引数を強制することも可能

実行

$ python3 manage.py cron

cronで定期実行の設定

$ crontab -e0 5 * * * /usr/local/bin/python3 /home/moyashi/mon/manage.py cron

今回は毎日朝5時に指定

おわりに

今回は比較的すんなり解決

--

--