커스텀 “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()
        # ...

핸들 방법의 dict 매개변수의 옵션(‘delete’)을 사용할 수 있습니다. “add_argument” 사용에 대한 자세한 내용은 :py:mod:’argparse’ Python 문서를 참조하십시오.

사용자 지정 명령줄 옵션을 추가할 수 있을 뿐만 아니라 모든 :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

명령에서 필수 위치 인수를 정의하는 경우 인수가 누락된 경우 반환되는 메시지 오류를 사용자 정의할 수 있습니다. 기본값은 :py:mod:’argparse’(“너무 적은 인수”) 출력입니다.

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``으로 출력됩니다.

If app_configs and tags are both None, all system checks are performed except deployment and database related checks. tags can be a list of check tags, like compatibility or models.

You can pass include_deployment_checks=True to also perform deployment checks, and list of database aliases in the databases to run database related checks against them.

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’까지 관리 명령이 호출되면 필요할 때 예외를 잡는 것은 사용자의 몫입니다.

Back to Top