Djangoでは manage.py の後にコマンドを入力するといろいろな操作を行うことができます。
今回はそんなカスタムコマンドを作成する方法と、作成が簡単になるサンプルコードの紹介です。
調べながらやると数分から、ハマると数時間かかる内容がコピペで一瞬でできるようになります。
カスタムコマンドの作成方法
- Djangoプロジェクトの中のアプリケーションの中に`management`フォルダを作成します。
- その中に`commands`というフォルダを作成します。
- “それぞれ”のフォルダの中に`__init__.py`という空のPythonファイルを作成します。
- manage.pyで「実行したいコマンド名.py」でPythonファイルを作成します。
※上記の例ではsend_mail.pyというカスタムコマンド用のファイルを作成しています。
タダのPythonファイルだとpython manage.py ファイル名
では実行できないのでBaseCommand
をインポートします。
from django.core.management import BaseCommand
そして、Djangoのモデルを利用したい場合はDjangoをセットアップする必要があるのでsettingsファイルを読み込みます。
import django,os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "プロジェクト名.settings")
django.setup()
あとはPythonファイルを単体で実行したときとmanage.pyから実行した時どちらからでも実行できるようにmain()関数でまとめたものを追加します。
最終的にできあがったのがこちらのファイルです。
カスタムコマンド用 チートファイル
いろいろ説明しましたが下記のファイルの「プロジェクト名」と「アプリ名」を置き換えて、実行したいコマンドを書くだけで大丈夫です。
from django.core.management import BaseCommand
import django,os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "プロジェクト名.settings")
django.setup()
from アプリ名.models import *
def main():
# ここに実行したいコマンドを記述
pass
class Command(BaseCommand):
def handle(self, *args, **options):
main()
if __name__ == '__main__':
main()
[Django] カスタムコマンドを実行
これでスムーズにカスタムコマンドを作ることができます。
カスタムコマンドを実行
上記のファイルを保存したらpython manage.py ファイル名
で上記のファイルを実行できます。
この記事の序盤で作成したsend_mail.pyの場合は
python manage.py send_mail
で実行できます。
カスタムコマンドをCronで実行
カスタムコマンドをCronから実行することで定期的にDjango内でプログラムの実行ができます。
Cronから実行する時はpythonとmanage.pyは絶対パスを使用してください。
Cron設定時の例
* * * * * /Users/myname/.pyenv/shims/python /Users/myname/project/app/manage.py ファイル名
最後に
サラッと書いて、この記事ではあまり触れなかったのですがDjangoモデルを実行するためにDjangoをセットアップするのに私はドハマリして何時間も浪費してしまいました。
↓この部分です。
import django,os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "プロジェクト名.settings")
django.setup()
この記事を見ていただいた方はハマること無く必要な作業に集中できるはずです(^^)
[…] [Django]カスタムコマンドの作成方法と便利なコード […]