[Django] カスタムコマンドを作成する
Djangoには独自の管理コマンドを定義する機能が用意されています。
独自コマンド
ここで言うDjangoのコマンドとは、
python manage.py runserver
などmanage.py
の後ろに続けるコマンドのことです。
定義する
早速、独自のコマンドを作っていきます。
今回は、コンソールにHello World!
するだけのコマンドhello
を実装していきます。
ファイルを作成する
事前準備
独自コマンドを記述するファイルは、配置する場所が決まっているのでまずはそのためのディレクトリを作成します。
Djangoのプロジェクトの名前をproject
、アプリケーションの名前をsample
とします。
project
├── manage.py
├── project
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── sample
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
こんな感じのディレクトリ構成になっていることを想定します。
アプリケーションディレクトリsample
の中にmanagement
、そのなかにcommands
というディレクトリを作ります。
さらにそれぞれの中に__init__.py
という名前のファイルを配置します。
project
├── manage.py
├── project
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── sample
├── __init__.py
├── admin.py
├── apps.py
├── management # 追加
│ ├── __init__.py # 追加
│ └── commands # 追加
│ └── __init__.py # 追加
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
配置後のディレクトリの構成はこんな感じです。
コマンドを記述するファイルを作る
この時、ファイル名がそのままコマンド名になります。
今回はファイル名をhello.py
とします。
このファイル名はご自身のお好きな名前で作ってもらって構いません。
先ほど作ったcommands
ディレクトリの中にhello.py
を作ります。
project
├── manage.py
├── project
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── sample
├── __init__.py
├── admin.py
├── apps.py
├── management
│ ├── __init__.py
│ └── commands
│ ├── hello.py # 追加
│ └── __init__.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
コマンドを実装する
先程作成したファイルにプログラム本体を記述していきます。
DjangoのコマンドはBaseCommand
クラスをを継承することで作成できます。
このとき継承したクラスの名前はCommand
にする必要があります。
from django.core.management import BaseCommand
class Command(BaseCommand):
def handle(self, *args, **options):
self.stdout.write('Hello World!')
handle
メソッドが本体でコマンドを叩かれた時にこのメソッドが実行されます。
今 作ったコマンドは、
python manage.py hello
とすれば実行出来ます。
オプションを追加する
流石にHello World!
するだけだとつまらないので、色を付けたり、複数回hello
出来るオプションをつけてみたいと思います。
add_arguments
メソッドでオプション引数を追加します。
コマンドライン引数の解析には内部でPythonの標準モジュールargparse
が利用されます。
from django.core.management import BaseCommand
class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument('-n', default=1, type=int,
help='how many print. default is 1')
parser.add_argument('--color',
type=str, default='')
def handle(self, *args, **options):
for _ in range(options['n']):
text = 'Hello World!'
color = options['color']
if color == 'red':
text = self.style.ERROR(text)
elif color == 'yellow':
text = self.style.WARNING(text)
elif color == 'green':
text = self.style.SUCCESS(text)
self.stdout.write(text)
おまけ
普通に画面に文字を表示する分には、print
もself.stdout.write
もそう差はありませんが、
stdout
の代わりにstderr
を利用する事で標準エラー出力に文字を送ることが出来るので見た目を統一するためにself.stdout.write
を利用することを推奨します。
最後に
ごく簡単にDjangoに独自のコマンドを追加する方法をご紹介しました。
普段よく使うアクションはコマンドにしておくと、何度も同じ作業をしなくて良くなるので積極的に利用していきたいですね。