LoginSignup
0
1

More than 3 years have passed since last update.

Django Customコマンドの中に潜ってみる [1]

Posted at

はじめに

初記事投稿になります。
勉強した事を何か形に残る形で残したいと思い始める事にしました。

djangoを深く使いこなす事をモットーに最近は勉強しております。
本記事は、djangoのカスタムコマンドについての勉強の足跡です。

目次

  1. djangoカスタムコマンドとは
  2. カスタムコマンド利用の前準備
  3. カスタムコマンドの作り方
  4. カスタムコマンドの流れ
  5. カスタムコマンドのカスタマイズ
  6. まとめ

1. djangoカスタムコマンドとは

CUIで、pythonスクリプトを実行できる仕組みであり、

・djangoの各種機能(db ORM等)が使える
・コマンドの管理がラク

といった利点があります。後者は、

-利用できるコマンドを一覧表示-

python manage.py --help
[shop]
    customcommand
    cusyomcommand2
    ...

-カスタムコマンドの説明を表示-

python manage.py customcommand --help
usage: manage.py customcommand2 [-h] [--version] [-v {0,1,2,3}]
                                [--settings SETTINGS]
                                [--pythonpath PYTHONPATH] [--traceback]
                                [--no-color] [--force-color] [--skip-checks]

データを格納する関数

このような事が可能です。

2. カスタムコマンド利用の前準備

(1) アプリケーションを作成(今回はscriptという名前で作成)

python manage.py startapp script

(2) management/commandsの階層構造を作成

script/
  ├── management/
         ├── commands/
  ├── admin.py
  ├── apps.py
  ├── models.py
  ├── tests.py
  └── views.py

(3) スクリプトファイルをcommands以下に入れる
  ここでは、customcommand.pyという名前で作成します

3. カスタムコマンドの作り方

基となるBaseCommandクラスのコメントを読むと、"コマンド実行のフローを変えない場合は、BaseCommandクラスを継承したCommandという名の子クラスを利用すれば良い"という旨が書かれているので、基本的には以下の構成で大丈夫だと思います。

customcommand.py

class Command(BaseCommand):

    # オーバーライドしたhandle関数にスクリプトで処理したい内容を記述
    def handle(self, *args, **options):
        pass

4. カスタムコマンドの流れ

本題のカスタムコマンドがどのように呼ばれ、どのような関数を経由して処理を行うかのお話です。

処理の流れは以下になります。

  1. python manage.py customcommandの実行

  2. Commandクラスの呼び出し

  3. run_from_argvメソッド

  4. create_parserメソッド

  5. add_argumentsメソッド

  6. parse_argsメソッド

  7. executeメソッド

  8. handleメソッド

run_from_argvという関数が全体の処理の流れを表して、その他の関数内で細かい処理をしているようなイメージを受けました。よって、4以降の細かい処理の概念を以下に記します。

4. create_parserメソッド

引数は[コマンドライン引数[0], コマンドライン引数[1]]の形式
->今回の例なら、['manage.py', 'customcommand']

まずmanage.pyのファイル名の切り出しを行います。
->manage.pyをフルパスで記載した場合はここでmanage.pyのみ取り出される。

次にParserオブジェクトを作成します。
Parserオブジェクトは以下のような属性を持ちます。
-prog: "manage.py customcommand" (命令をスペースで区切ったもの)
-description: help文 (self.helpで取得)
-formatter_class: (--versionといったあらかじめ決められたDjangoのhelpオプション)
など

※parserオブジェクト自体は予期される引数を持つイメージです。

5. add_argumentsメソッド

parserオブジェクトに処理で用いたい引数を追加します。例えば、
parser.add_argument('parameters', nargs='+', type=int)
とすれば、int型の1つ以上の引数を強制する事ができます。
->python manage.py customcommand 3 5 など

6. parse_argsメソッド

ここで実際に入力した命令群のフォーマットの確認を行います。
・--version等、Djangoのhelpオプションが来た場合はここで処理を終える
・入力フォーマットが違う場合は、予期される引数(parserの中身)を標準出力する

7,8. executeメソッド, handleメソッド

6の処理でフォーマットチェックを通過した場合のみexcuteメソッドに渡され、handleメソッドに渡されます。
※5の処理で、引数を追加した場合はhandleメソッドのoptions引数から参照する事ができます。

5. カスタムコマンドのカスタマイズ

コマンドのヘルプ文の追加


help = '~する関数'

help引数を定義しておけばOK

引数の追加

ArgumentParserの使い方を簡単にまとめた
こちらの記事で詳しく解説されていました。

6. まとめ

色々と調べましたが、よっぽどhandle関数とadd_arguments関数、後はhelpの追加くらいを押さえて置いたら大丈夫そうな印象を受けました。
parseオブジェクトの概念に関しては、可変な引数の扱いなどで広く使われていそうなので、勉強になりました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1