Django Command 생성 방법

미음제

·

2020. 11. 12. 02:23

장고를 이용해 Command를 생성하는 방법을 알아보자.

 

 

 

 

그전에

나의 Command를 생성하는 방식은

내가 장고를 이용하는 것이 아니라

장고가 나의 코드를 이용하는 예시 중 하나이다.

 

 

 

1. management 폴더,  __init__.py 생성

 

프로젝트를 진행하면서 생성한

여러 어플리케이션들이 있을 것이다.

 

나의 Command를 만들고 싶다면,

우선 아무 어플리케이션에 들어가서

management라는 폴더를 만든다.

 

그리고, 생성된 management 폴더에

__init__.py를 생성해준다.

 


 

2. commands 폴더,  __init__.py 생성

management 폴더에
commands 폴더를 생성하고

똑같이 __init__.py를 생성해준다.

 

 

 

 

__init__.py의 역할은

__init__.py가 있는 폴더가

장고에게 파이썬 폴더라는 것을 알려주는 것이다.

 

 

 

그리고 management 폴더에

내가 만들고 싶은 command를 만들어 준다.

임의의 파일명.py

 

 

 

 

이렇게 되면 Command 생성은 완료된 것이다.

그리고 콘솔 창에서
원하는 Command를 실행시킨다.

 

 


 

3. commands 실행

python manage.py 생성한Command이름 --times 50

내가 생성한 Command를
50번 실행하라는 명령이다.

 

실행하면 에러가 발생한다.

AttributeError : module 'lists.management.commands.ex' has no attribute...

 

모듈 속성이 없다는 내용의 에러를 반환한다.

당연히 코드가 없기 때문에 에러가 발생한다.

 

 

 

장고에선 Command에 대한
가이드라인을 제공하고 있다.

https://docs.djangoproject.com/en/3.1/howto/custom-management-commands/

 


 

4. 코드 작성

가이드라인을 따라
BaseCommnad를 import 해준다.

from django.core.management.base import BaseCommand

그리고 생성한 Command의
argument를 parse 하는데 사용되는
"Argument Parser"를
생성하고 반환하라고 한다.

 

 

즉 Command를 작성하고 실행해도

argument(나의 경우 number)를
이해하지 못하기에

parser를 생성해야 한다는 것이다.

 

 

 

 

 

다시 코드를 작성하면

from django.core.management.base import BaseCommand


class Command(BaseCommand):

    help = "This is command"

    def add_arguments(self, parser):
        parser.add_argument("--times", help="Command Create")

그리고 다시 콘솔 창에서 실행하면

times의 attribute 에러는 사라지게 된다

 

 

 

 

그리고 

python manage.py ex --help

를 콘솔창에 실행해주면

 

 

times에 내가 입력한 코드가 나온다.

 

 

 

 

 

그러나 여전히

NotImplementedError: subclasses of BaseCommand must provide a handle() method

에러가 남아있다.

 

이를 해결하기 위해서는

BaseCommand가 handle()을 제공해야 한다.

 

 

 

handle()은 자기 자신을 부르고

arguments와 options를 갖는다

 

 

 

이를 코드로 작성하면

def handle(self, *args, **options):
        print(args, options)
        print("Commands")

 

 

그리고

콘솔창에 다시 Command를 실행하면

 

 

이 같은 결과가 나온다.

 

입력한 대로 times는 50이고,

"Command"도 정상 출력했다.

 

 

 

에러가 없어진 것을 확인했으니

Command를 50번 출력하도록
코드를 수정해보자.

 

 

 

def handle(self, *args, **options):
        times = options.get("times")
        for a in range(0, int(times)):
            print("Commands")
python manage.py ex --times 50

코드를 입력하고,
콘솔 창에 Command를 실행하면

 

 

 

원하는 대로
"Commands"가 50번 출력되는 것을
확인할 수 있다.

 

 

이것이 임의의 Command를

생성하는 방법이다.

반응형