# Django 6.0.7 문서

# 커스텀 “django-admin” 명령을 만드는 방법

신청서는 자체 조치를 `manage.py"에 등록할 수 있다. 예를 들어 "manage.py"액션을 Django 앱을 사용하면서 추가하고 싶을수도 있을것이다. "이 문서에서는 "조사" 신청에 대한 사용자 정의 ``closepoll` 명령어를 :doc:’tutorial1에서 만들 것이다.

이를 위해선 `management/commands` 디렉토리를 애플리케이션에 추가합니다. 장고는 이 디렉토리 내의 파이썬 모듈 중 언더스코어로 시작하지 않는 모듈들을 ``manage.py``에 커맨드로 등록합니다. 예를 들면:

    polls/
        __init__.py
        models.py
        management/
            __init__.py
            commands/
                __init__.py
                _private.py
                closepoll.py
        tests.py
        views.py

이 예에서 ``closepoll” 명령어는 “polls” 적용을 포함하는 모든 프로젝트에서 사용할 수 있게 된다 `INSTALLED_APPS`.

``_private.py” 모듈은 관리 명령으로 사용할 수 없습니다.

``closepoll.py” 모듈은 다음과 같이 확장되는 “Command” 등급을 정의해야 하는 하나의 요건만 가지고 있다.Base Command 또는 그 중 하나인 ref:’subclasses.

독립 실행형 스크립트

사용자 지정 관리 명령은 특히 독립 실행형 스크립트를 실행하거나 UNIX crontab 또는 윈도우즈 스케줄링된 태스크 제어판에서 정기적으로 실행되는 스크립트에 유용합니다.

명령을 구현하려면 `polls/management/commands/closepoll.py` 를 편집하십시오

    from django.core.management.base import BaseCommand, CommandError
    from polls.models import Question as Poll

    class Command(BaseCommand):
        help = "Closes the specified poll for voting"

        def add_arguments(self, parser):
            parser.add_argument("poll_ids", nargs="+", type=int)

        def handle(self, *args, **options):
            for poll_id in options["poll_ids"]:
                try:
                    poll = Poll.objects.get(pk=poll_id)
                except Poll.DoesNotExist:
                    raise CommandError('Poll "%s" does not exist' % poll_id)

                poll.opened = False
                poll.save()

                self.stdout.write(
                    self.style.SUCCESS('Successfully closed poll "%s"' % poll_id)
                )

참고

관리 명령을 사용하고 콘솔 출력을 제공하려면 “stdout”과 “stderr”로 직접 인쇄하지 말고 “self.stdout”과 “self.stderr”로 써야 합니다. 이러한 프록시를 사용하면 사용자 지정 명령을 훨씬 쉽게 테스트할 수 있습니다. 또한 다음과 같은 “ending” 매개 변수를 지정하지 않으면 메시지를 새 줄 문자로 끝낼 필요가 없습니다.

    self.stdout.write("Unterminated line", ending="")

새로운 커스텀 커맨드는 `python manage.py closepoll 1`.를 사용하여 부를 수 있다

``handle()” 방식은 하나 이상의 ``poll_ids”를 가져다가 ``poll. opened”를 각각 “False”로 설정한다. 사용자가 존재하지 않는 폴링을 참조한 경우:exc:Command Error가 발생합니다. “poll.opened” 속성은 :doc:”tutorial”에 존재하지 않으며 이 예시에서는 “polls.models.example’에 추가되었다

## 선택적 인수 수락

동일한 ``closepoll”를 쉽게 수정해 추가 명령줄 옵션을 수용함으로써 해당 여론조사를 마감하는 대신 삭제할 수 있다. 이러한 사용자 지정 옵션은 다음과 같은 :meth:’~BaseCommand.add_arguments 메서드에 추가할 수 있습니다.

    class Command(BaseCommand):
        def add_arguments(self, parser):
            # Positional arguments
            parser.add_argument("poll_ids", nargs="+", type=int)

            # Named (optional) arguments
            parser.add_argument(
                "--delete",
                action="store_true",
                help="Delete poll instead of closing it",
            )

        def handle(self, *args, **options):
            # ...
            if options["delete"]:
                poll.delete()
            # ...

해당 옵션(이 예시에서는 `delete`)은 핸들 메서드의 options 딕셔너리 매개변수에서 사용할 수 있습니다. `add_argument` 사용에 대한 자세한 내용은 Python의 `argparse` 문서를 참고하세요.

사용자 지정 명령줄 옵션을 추가할 수 있을 뿐만 아니라 모든 :doc:’관리 명령’은 :option:’–verbity’ 및 :option:’–traceback’과 같은 기본 옵션을 사용할 수 있습니다.

## 관리 명령 및 로케일

기본적으로 관리 명령은 현재 활성 로케일로 실행됩니다.

어떤 이유로 사용자 지정 관리 명령이 활성 로케일 없이 실행되어야 하는 경우(예: 변환된 콘텐츠가 데이터베이스에 삽입되지 않도록 하려면, 다음 방법:meth:’~BaseCommand.handle’에서 “@no_translations’ decorator”를 사용하여 변환을 비활성화하십시오.

    from django.core.management.base import BaseCommand, no_translations

    class Command(BaseCommand):
        ...

        @no_translations
        def handle(self, *args, **options): ...

변환 비활성화에는 구성된 설정에 대한 액세스 권한이 필요하므로 구성된 설정 없이 작동하는 명령에는 장식자를 사용할 수 없습니다.

## 테스트중

사용자 지정 관리 명령의 테스트 방법에 대한 정보는 :ref:’testing documents’에서 확인할 수 있습니다.

## 명령 재정의

Django는 내장 명령을 등록한 다음 :seting:’에서 명령어를 검색한다.`INSTALLED_APPs는 역방향입니다. 검색 중에 명령 이름이 이미 등록된 명령을 중복하면 새로 검색된 명령이 첫 번째 명령을 재정의합니다.

즉, 명령을 재정의하려면 새 명령의 이름이 동일해야 하며 해당 앱은 재정의된 명령의 앱 앞에 있어야 합니다. setting:’INSTALLED_APPS.

의도하지 않게 재정의된 타사 앱의 관리 명령은 오버라이드 커맨드의 “Command” 를 들여오는 프로젝트의 앱(:setting:`INSTALLED_APPS`으로 서드파티 앱 앞에 주문된 ) 중 하나에 새 명령을 만들어 새 이름으로 사용할 수 있습니다

## 커맨드 개체

class BaseCommand

모든 관리 명령이 궁극적으로 파생되는 기본 클래스입니다.

명령줄 인수를 구문 분석하고 응답으로 호출할 코드를 알아내는 모든 메커니즘에 액세스하려면 이 클래스를 사용합니다. 이러한 동작을 변경할 필요가 없으면 ref:’subclasses’ 중 하나를 사용하십시오.

:클래스 하위 분류:’BaseCommand’ 클래스는 :meth:’~BaseCommand.handle’ 메소드를 구현해야 합니다.

### 속성

모든 속성은 파생 클래스에서 설정할 수 있으며:class:BaseCommand’s :ref:`subclasses1에서 사용할 수 있습니다.

BaseCommand.help

  사용자가 `python manage" 명령을 실행할 때 도움말 메시지에 표시되는 명령어에 대한 간단한 설명입니다 ``python manage.py help 1`.

BaseCommand.missing_args_message

  명령에서 필수 위치 인수를 정의한 경우, 인수가 누락되었을 때 반환되는 오류 메시지를 사용자 정의할 수 있습니다. 기본적으로 :mod:`argparse`에서 “too few arguments”(인수가 너무 적음) 메시지가 출력됩니다.

BaseCommand.output_transaction

  명령어가 SQL 문을 출력하는지 여부를 나타내는 부울로, “True”일 경우 출력은 자동으로 “BEGIN”과 “COMIT”로 포장된다. 기본값은 “False”입니다.

BaseCommand.requires_migrations_checks

  불. “True”인 경우 명령은 디스크의 마이그레이션 집합이 데이터베이스의 마이그레이션과 일치하지 않을 경우 경고를 인쇄합니다. 경고는 명령 실행을 차단하지 않습니다. 기본값은 “False”입니다.

BaseCommand.requires_system_checks

  태그 리스트나 튜플, 예: `[Tags.staticfiles, Tags.models]`. 시스템 검사 선택한 태그<registering-labeling-checks>에 등록됨`은 명령을 실행하기 전에 오류를 검사합니다. 값 `’__all__’``은 모든 시스템 검사가 수행되어야 함을 지정하는 데 사용할 수 있습니다. 기본값은 ``’__all__’``입니다.

BaseCommand.style

  “stdout” 또는 “stderr”에 쓸 때 컬러 출력을 생성하는 데 도움이 되는 인스턴스 속성이다. 예를 들어:

      self.stdout.write(self.style.SUCCESS("..."))

  색상표를 수정하는 방법과 사용 가능한 스타일을 보려면 Syntax coloring 을 참조하십시오(이 절에서 설명하는 “roles”의 대문자 버전 사용).

  명령을 실행할 때 “-no-color” 옵션을 통과하면 모든 ``self.style()” 호출이 원래 문자열을 무색하게 반환됩니다.

BaseCommand.suppressed_base_arguments

  도움말 출력에서 억제할 기본 명령 옵션입니다. 이것은 옵션 이름의 집합이어야 합니다(예: `'--verbosity'`). 억제된 옵션의 기본값은 여전히 전달됩니다.

### 메소드

:class:’BaseCommand’에는 무시할 수 있는 몇 가지 방법이 있지만 :meth:’~BaseCommand.handle’ 방법만 구현하면 됩니다.

하위 클래스에 생성자 구현

__init__”을(를) :class:’BaseCommand’의 하위 클래스에서 구현할 경우 :classBaseCommand의 ``__init__”:를 호출해야 합니다.

    class Command(BaseCommand):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            # ...

BaseCommand.create_parser(prog_name, subcommand, **kwargs)

  “CommandParser” 인스턴스를 반환하는데, 이 인스턴스는 Django에 대한 사용자 지정이 몇 가지 있는:class:`ArgumentParser` 서브클래스이다

  You can customize the instance by overriding this method and calling `super()` with `kwargs` of `ArgumentParser` parameters.

BaseCommand.add_arguments(parser)

  명령에 전달된 명령줄 인수를 처리할 구문 분석기 인수를 추가하는 진입점입니다. 사용자 지정 명령은 이 메서드를 재정의하여 명령에서 수락한 위치 및 선택적 인수를 모두 추가해야 합니다. “BaseCommand”를 직접 하위 분류할 때는 “super()”라고 부를 필요가 없다.

BaseCommand.get_version()

  내장된 모든 Django 명령에 대해 정확해야 하는 Django 버전을 반환합니다. 사용자 제공 명령은 해당 버전을 반환하기 위해 이 방법을 재정의할 수 있습니다.

BaseCommand.execute(*args, **options)

  필요한 경우 시스템 검사를 수행하여 이 명령을 실행하시오( :attr:’requires_system_checks’ 속성에 의해 제어됨). 커맨드가 `CommandError` 을 보여주는 경우, 중간에 가로채져 ``stderr``에 출력될 것입니다.

코드에서 관리 명령 호출

명령을 실행하기 위해 코드에서 직접 “execute”를 불러서는 안 된다. 대신 func:’~django.core.management.call_command’를 사용합니다.

BaseCommand.handle(*args, **options)

  명령의 실제 논리입니다. 하위 클래스는 이 방법을 구현해야 합니다.

  그것은 “stdout”으로 인쇄될 문자열을 반환할 수도 있다. (‘BEGIN’과 ‘’COMIT’’로 포장된 문자열:attr:’output_transaction’이 “true”일 경우)

BaseCommand.check(app_configs=None, tags=None, display_num_errors=False, include_deployment_checks=False, fail_level=checks.ERROR, databases=None)

  시스템 검사 프레임워크를 사용하여 전체 장고 프로젝트에 잠재적인 문제가 있는지 검사합니다. 심각한 문제는 다음과 같이 제기됩니다:exc:CommandError;경고는 ``stderr``로 출력되고 경미한 알림은 ``stdout``으로 출력됩니다.

  ``app_configs``와 ``tags``가 모두 ``None``인 경우, 배포 및 데이터베이스 관련 검사를 제외한 모든 시스템 검사가 수행됩니다. ``tags``는 ``compatibility``나 ``models``와 같은 검사 태그의 목록일 수 있습니다.

  ``include_deployment_checks=True``를 전달하면 배포 검사도 수행할 수 있으며 ``databases``에 데이터베이스 별칭 목록을 지정하면 데이터베이스 관련 검사가 실행할 수 있습니다.

BaseCommand.get_check_kwargs(options)

  `check()` 호출에 사용할 kwargs를 제공하며, 이 과정에는 `requires_system_checks` 값을 `tag` kwarg로 변환하는 작업도 포함됩니다.

  :meth:`check`에 제공되는 값을 변경하려면 이 메서드를 오버라이드하세요. 예를 들어, 데이터베이스 관련 검사를 사용하려면 다음과 같이 ``get_check_kwargs()``를 오버라이드하면 됩니다:

      def get_check_kwargs(self, options):
          kwargs = super().get_check_kwargs(options)
          return {**kwargs, "databases": [options["database"]]}

### `BaseCommand` 하위 클래스

class AppCommand

하나 이상의 설치된 응용 프로그램 레이블을 인수로 사용하고 각 레이블로 작업을 수행하는 관리 명령입니다.

서브클래스는 :meth:’~BaseCommand.handle’을 구현하기 보다는 :meth:’~AppCommand.handle_app_config’를 구현해야 하며, 각 애플리케이션마다 한 번씩 호출된다.

AppCommand.handle_app_config(app_config, **options)

  “app_config”에 대한 명령의 작업을 수행합니다. 이 작업은 :class가 됩니다.’~django.the’AppConfig’ 인스턴스는 명령줄에 지정된 애플리케이션 레이블에 해당합니다.

class LabelCommand

명령줄에서 하나 이상의 임의 인수(라벨)를 가져와 각 인수와 작업을 수행하는 관리 명령입니다.

서브클래스는 :meth:’~BaseCommand.handle’을 구현하기 보다는 :meth:’~LabelCommand.handle_label’을 구현해야 하며, 각 레이블에 대해 한 번 호출된다.

LabelCommand.label

  명령에 전달된 임의 인수를 설명하는 문자열입니다. 문자열은 명령의 사용 텍스트 및 오류 메시지에 사용됩니다. 기본값은 “‘label‘“입니다.

LabelCommand.handle_label(label, **options)

  명령줄에 지정된 문자열인 “라벨”에 대해 명령의 작업을 수행합니다.

### 예외적 명령

exception CommandError(returncode=1)

관리 명령을 실행하는 동안 문제를 나타내는 예외 클래스입니다.

명령줄 콘솔에서 관리 명령을 실행하는 동안 이 예외가 발생하면 해당 명령이 캡처되어 적절한 출력 스트림(예, `stderr`)으로 인쇄된 오류 메시지로 전환됩니다. 따라서 오류에 대한 적절한 설명을 통해 이 예외를 발생시키는 것이 좋습니다.명령을 잘못 실행하다 그것은 :func:’sys.exit’을 사용하여 관리 명령의 종료 상태를 사용자 정의하기 위한 선택적인 `returncode` 주장을 수용한다.

코드에서 :func:’~django.core.management.call_command’까지 관리 명령이 호출되면 필요할 때 예외를 잡는 것은 사용자의 몫입니다.