読者です 読者をやめる 読者になる 読者になる

くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

DjangoでBatch処理(カスタムコマンド)

Djangoを使ったWebサービスを作っている際に、バッチ処理が必要になったので、その際の備忘録。

環境は、Django1.10.1とPython2.7

Djangoの機能を利用したバッチを作るならカスタムコマンド

いろいろ調べてみたところ、Djangoの機能を使いつつ、バッチ処理をするには、 manage.pyのカスタムコマンドを作るのがよいよう

refs: 公式のドキュメント(Writing custom django-admin commands | Django documentation | Django)

最終的には、

python manage.py <自作コマンド>

で実行できるようになる。

カスタムコマンドは、BaseCommandを継承したクラスCommandを実装すればOK

自作のコマンドを作るには、BaseCommandを継承したクラスを作成すれば良いらしい。
また、デフォルトでは、ファイルの置き場所はmanagement/commandsでなければならない。それ以外に配置しても認識されなかった。。。

$ cd app
$ mkdir -p management/commands && touch management/__init__.py management/commands/__init__.py

雛形はこんな感じ。あとは、handle()内に処理を書けばOK
これでmodelsなども扱えるので、一括実行系の処理などもできるようになる。

from django.core.management.base import BaseCommand, CommandError

class Command(BaseCommand):

  """ Main """
  def handle(self, *args, **options):
    # ここに実行したい処理を書く
    print "カスタムコマンドを実行"

あとは、cronなどで、よしなに定期実行すれば、良い感じに。

atasatamataraさんの記事(Django のコマンドを作って定期的に実行する - 憧れ駆動開発)で、 「cronにするときはちゃんとシェルスクリプトをつくっておこう」と書いてあったので、そうしよう

#!/bin/bash
export DJANGO_SETTINGS_MODULE=mysite.settings
. /path/to/virtualenv/dev/bin/activate
cd /path/to/src
python manage.py some_command

以上!!

参考にしたサイト様