前回の記事「カスタム django-admin コマンドを実装して、外部からアプリ内のモデルを使う」の続きです。
背景
前回は、カスタムコマンドとして、「crawler」を追加し、$ python manage.py crawler
で、実行できるようにしました。
今回は、そのコマンドに引数を渡して、処理を切り替えられるようにします。
サンプルのコード
-
add_arguments
という関数を実装し、引数の扱い方を指定します。
from django.core.management.base import BaseCommand, CommandError
from app1.models import Topic
class Command(BaseCommand):
help = 'crawler for test.'
def add_arguments(self, parser):
parser.add_argument('-c', '--check-alive', action='store_true', dest='check-alive', help='Check topic alive.')
def handle(self, *args, **options):
#self.myprint("options=%s" % options)
if not options['check-alive']:
self.crawl_new()
else:
self.check_alive()
def crawl_new(self):
self.myprint('this is function crawl_new.')
def check_alive(self):
self.myprint('this is function check_alive.')
要点
-
引数は、
--version
のように後続の引数が無いものと、--verbosity 3
のように後続の引数が有るものの2種類に分けられます。- 後続の引数が無い場合は、
action='store_true'
を指定します。(これの詳しい解説記事が見つからなかった)。引数が指定されたか否かは、True/Falseで格納されます。 - 後続の引数が有る場合は、
nargs='*'
を指定します。後続の引数は辞書型で格納されます。後続の引数が省略された場合は、空の辞書が格納されます。
- 後続の引数が無い場合は、
-
さらに、
dest='check-alive'
で、引数がどのように指定されたかをoptions
にどんなキーで格納するかを指定します。- この指定が無いと、引数名の長い方の名前で、
-
を_
に変換したキーで格納されます。(上記の例ではoptions['check_alive']
)。 - 引数に長い名前の場合はハイフンを使う場合が多いので、destを指定した方が無難かと思います。
- この指定が無いと、引数名の長い方の名前で、
気になる点
- 上記の場合、
-c
の代わりに-cc
や-cccccccc
のように同じ文字を重ねて指定しても同じ結果になりますが、-c1
のように異なる文字を指定するとerror: argument -c/--check-alive: ignored explicit argument '1'
とエラーになります。長い引数の場合は--check-alivee
のように末尾の同じ文字を重ねるとエラーになります。