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를
생성하는 방법이다.
'Developer > Django' 카테고리의 다른 글
장고 Integrity Error, NOT NULL constraint failed (0) | 2020.11.18 |
---|---|
[프로젝트 2일차] Django ORM에 대한 이해 (2) | 2020.11.06 |
Framework(프레임워크), Library(라이브러리)의 차이 (0) | 2020.11.05 |