[Django] Custom Command (BaseCommand)

2020. 5. 8. 14:03프로그래밍/Django

django-admin commands

장고 앱을 위해 커스텀 커맨드를 이용해 manage.py에 작업을 추가할 수 있다.

  • 커스텀 커맨드는 <app_name>/management/<command_name>.py 경로에 있어야 한다.

    video/
      __init__.py
      models.py
      management/
          commands/
              __init__.py
              manage_video.py

 


 

아래는 manage_video.py(위의 <command_name>.py 위치) 예시인데,

나는 --a 라는 커맨드를 입력하면 logic_a 코드가 실행되게 하고 싶었고,
--b 라는 커맨드를 입력하면 logic_b 코드가 실행되게 하고 싶었다.

manage_video.py

from django.core.management.base import BaseCommand

class Command(BaseCommand):
    help = 'manage video objects'

    def add_argements(self, parser):
        parser.add_argument('--a', action='store_true', dest='a', type=bool)
        parser.add_argument('--b', action='store_true', dest='b', type=bool)

    def handle(self, *args, **options
        if options['delete_all']:
            logic_a
        if options['dump_original']:
            logic_b

 

add_arguments 메서드

Django 는 Python의 표준 라이브러리의 일부인 argparse를 사용한다.
사용자 정의 명령에서 인수를 처리하려면, add_arguments 라는 메소드를 정의해야한다.

 

 

ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])¶

  • name or flags: 옵션 문자열의 이름이나 리스트.
    인수의 이름 앞에 --가 없으면 필수값이고 위치에 기반한 파라미터가 되지만, --가 붙으면 이름에 기반한 optional 인수가 된다.

  • action: 명령행에서 이 인자가 발견될 때 수행 할 액션의 기본형.
    action="store_true"는 만약 커맨드에 --a가 포함된 경우,  parse_args()가 반환하는 객체에서 a의 값이 True로 지정된다. 만약 커맨드에 --b가 포함되지 않은 경우엔 b의 값이 False로 지정된다.

  • dest: parse_args() 가 반환하는 객체에 추가될 어트리뷰트의 이름.

  • type: 인수의 형식을 지정

 

커맨드에 --a만 입력한 경우

(videoapi) bash-4.2# python manage.py manage_video --a

# print(options)
{'verbosity': 1, 'settings': None, 'pythonpath': None, 'traceback': False, 'no_color': False, 'force_color': False, 'skip_checks': False, 'a': True, 'b': False}

커맨드에 --b만 입력한 경우

(videoapi) bash-4.2# python manage.py manage_video --b
{'verbosity': 1, 'settings': None, 'pythonpath': None, 'traceback': False, 'no_color': False, 'force_color': False, 'skip_checks': False, 'a': False, 'b': True}

커맨드에 --a --b 모두 입력한 경우

(videoapi) bash-4.2# python manage.py manage_video --a --b
{'verbosity': 1, 'settings': None, 'pythonpath': None, 'traceback': False, 'no_color': False, 'force_color': False, 'skip_checks': False, 'a': True, 'b': True}

 

handle() 메서드

handle() 메서드 안에 커스텀 커맨드의 기능/로직을 구현하면 된다.

 

 

 


 

References

https://docs.python.org/ko/3/library/argparse.html
https://simpleisbetterthancomplex.com/tutorial/2018/08/27/how-to-create-custom-django-management-commands.html

'프로그래밍 > Django' 카테고리의 다른 글

[Django] 배포 - WSGI  (0) 2020.05.05
[Django] 장고 CORS 크로스 도메인 이슈  (1) 2020.01.16