10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Djangoで何らかのスクリプトを定期実行する方法

Posted at

きっかけ

趣味で開発しているWebアプリで、
「毎朝7時にニュースサイトから記事を集めてくる」
的なことをやりたくなった

概要

  1. Django commandというのを新しく作る
  2. 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だよ」と教える必要がある
そのために最低限必要な記述は以下

sample.py
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を使っているときとか

crontabについての詳細

10
8
1

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
10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?