きっかけ
趣味で開発しているWebアプリで、
「毎朝7時にニュースサイトから記事を集めてくる」
的なことをやりたくなった
概要
- Django commandというのを新しく作る
- crontabでDjango commandを定期実行させる
手順
1. Django commandを新規作成する
そもそもDjango Commandとは何かというと
python manage.py runserver
python manage.py migrate
のようにpython manage.py
の後に続くもの
上記二つは元々あるコマンド
実はこのコマンドは自作できる
詳細は公式から
まずアプリ1ディレクトリの下にmanagement
ディレクトリを作成する
management
ディレクトリの下にcommands
ディレクトリを作成する
__init__.py
は特に作らなくても大丈夫
commands
ディレクトリの下に、何かしらのスクリプトを作成する
これが新しいDjango commandになる
つまり
python manage.py 何かしら
と入力すれば、「何かしら」の中のスクリプトが実行されるようになる
プロジェクト
├── アプリ1
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── management ← こいつを新しく作るよ
│ │ ├── __init__.py
│ │ └── commands ← こいつを新しく作るよ
│ │ ├── __init__.py
│ │ └── 何かしら.py ← こいつを新しく作るよ
│ ├── migrations
│ ├── models.py
│ ├── tests.py
│ ├── urls.py
│ └── views.py
├── アプリ2
└── manage.py
2. コマンドの中身を記述する
今、アプリ1/management/commands/何かしら.py
が作成されている状況
配置はOK
次は、中身で「これはDjango commandだよ」と教える必要がある
そのために最低限必要な記述は以下
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def handle(self, *args, **options):
"""ここに思い思いのスクリプトを記述する"""
pass
3. crontabに記述する
crontab -e
で編集を行う
#毎朝7時に何かしらを実行する
#実行結果はlog.txtに記録する
0 7 * * * /絶対パス/python3 /絶対パス/manage.py 何かしら > /絶対パス/log.txt 2>&1
crontabで実行したいコマンドを入力するときは絶対パスで指定するのが良い
特に、仮想環境下のpythonを使っているときとか