
背景
Djangoでバッチを実行することになりました。
Railsの場合はRakeタスクがあります。Djangoの場合はどのように行うのか調べて試してみました。
既存のカスタムコマンドの確認
Djangoでコマンドを追加するには、manage.pyを使ったカスタムコマンドと呼ばれる処理を追加することになります。もともとDjangoにはmanage.pyを利用したコマンドがいくつもあります。一覧で見てみましょう。一覧で見るにはmanage.pyに引数をつけずに実行します。
1 | $ docker-compose run --rm web python manage.py |
runserverやstartprojectなど見慣れたコマンドもいくつかありますが、ほとんど知らないコマンドです。こんなにあるんですね。
[]で囲まれているのはアプリケーション名でしょうか。settings.pyのINSTALLED_APPSに指定されている名前と一致しています。
カスタムコマンドを追加する
カスタムコマンドの追加方法はこちらに記載されています。正確にはカスタムマネジメントコマンドなんですね。
実行ファイルを配置する
先ほどの公式サイトには以下のようにディレクトリ階層が書かれています。
1 | polls/ |
ですので、アプリケーションディレクトリの下にmanagementディレクトリを作成し、その下にcommandsディレクトリを作成して、その下に実行するファイルを置く感じのようです。
実際に作成してみます。
1 | $ cd sample_application |
これで実行ファイルを配置することができました。
実行ファイルを実装する
カスタムコマンドの実行方法についても、先ほどの公式サイトに記載されています。
例ではBaseCommandとCommandErrorをimportしていますが動かすだけであればBaseCommandのみでよさそうです。今回は単純なサンプルを作って実行できるところまで試したいので、BaseCommandのみ利用したいと思います。
(タスクが正常に動作しなかった場合はCommandError例外をあげて知らせるということだと思います)
ということで、dummy.pyを実装してみました
1 | from django.core.management.base import BaseCommand |
では実行してみます。
カスタムコマンドを実行する
それでは実行してみましょう。
1 | $ docker-compose run --rm web python manage.py dummy |
おっと、実行に失敗してしまいました…どこか設定が足りないようなので、調べてみます。
INSTALLED_APPへの追加
どの設定が足りないのかを調べていたところ、公式サイトにあまり目立たない感じで以下のように書かれていました。
1 | In this example, the closepoll command will be made available to any project that includes the polls application in INSTALLED_APPS. |
この例の場合は、pollsをINSTALLED_APPSに設定すると有効になります、的なことが書いてあるのかと思います。
ということでINSTALLED_APPSに追加します
1 | $ git diff sample_application/settings.py |
では実行してみます
1 | $ docker-compose run --rm web python manage.py dummy |
無事実行できました!
まとめ
今回カスタムコマンドの追加方法を学びました。INSTALLED_APPSに追加していなかったところ以外はスムーズでした。通常はアプリケーションは追加されているはずなので、わざわざINSTALLED_APPSに追加するという説明はほとんど書かれていません。参考図書の実践Django Pythonによる本格Webアプリケーション開発にも、カスタムコマンドの追加に関しては3ページくらいさいてあるのですが(280ページ、管理コマンドの追加)、INSTALLED_APPSに追加しないと有効にならないとは記載されていません。わたしみたいな初心者しかここでは躓かないのかもしれませんね。
次回はこのコンテナを使ってカスタムコマンドをAWS Batchで実行しようと思います。