django에서 사용자 정의 명령을 만드는 방법

24149 단어 djangopythontutorial
django 프로젝트를 개발할 때, 특정 작업을 자동화하기 위해 일회용 스크립트를 작성해야 합니다.계속 실현하기 전에, 나는 내가 몇 가지 용례를 응용한 것을 발견했다.
  • 전체 정리 고장 데이터 열.
  • multitenant application 에서 여러 모드 마이그레이션
  • django에서 이 종류의 명령을 실행하는 데는 두 가지 방법이 있습니다.일반적인python 스크립트를 작성한 다음 실행 python file_name.py 을 통해 호출하고, 다른 하나는djangoadmin 명령을 사용합니다.이것들은 호출python manage.py command_name을 통해 실행된다.
    이 글에서 저는 데이터베이스 테이블이 3개밖에 없는 블로그 응용 프로그램으로 User,Category,post를 보여 드리겠습니다.
    나는 당신이django 프로젝트를 쉽게 초기화할 수 있다고 가정하지만, 만약 당신이 원하지 않는다면, this post 당신을 도울 수 있을 것입니다.
    소스 코드는 여기서 찾을 수 있습니다.👇🏽.

    루이스 코리 / django 명령


    django 사용자 정의 명령 구현 프레젠테이션


    일반python 스크립트 방법


    첫 번째 예시에서, 우리는 아래의 스크립트를 사용하여 모든 시스템 사용자를 열거하려고 시도할 것이다
    from django.contrib.auth import get_user_model
    
    User = get_user_model()
    
    # retrieve all users
    users = User.objects.all()
    
    # loop through all users
    for user in users:
        print(f'user is {user.get_full_name()} and their username is {user.get_username()}')
    
    스크립트를 list\u 사용자로 지정할 수 있습니다.py 및 실행python list_users.py일단 이걸 실행하면 오류가 발생합니다.
    django.core.exceptions.ImproperlyConfigured: Requested setting AUTH_USER_MODEL, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
    
    django의 프로젝트 디렉터리에서 스크립트가 문제없이 실행될 것이라고 가정할 수 있습니다.
    그러나 사실은 그렇지 않다.스크립트가 어떤 항목에 적용될지 모르기 때문이다.당신은 한 대의 기계나 가상 환경에서 여러 개의 항목을 가질 수 있습니다.따라서 스크립트에 상하문을 주는 것이 중요하다.
    우리는 스크립트를 약간 수정함으로써 이 점을 실현할 것이다.
    import os
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'projectname.settings')
    
    import django
    django.setup()
    
    from django.contrib.auth import get_user_model
    
    User = get_user_model()
    
    users = User.objects.all()
    
    for user in users:
        print(f'user is {user.get_full_name()} and their username is {user.get_username()}')
    
    여기에서 우리는 프로젝트의 설정을 지정합니다. 호출 django.setup() 방법뿐만 아니라.이 방법은 설정, 로그 기록을 설정하고 응용 프로그램 등록표를 채웁니다.요컨대, 우리는 스크립트로 하여금 우리의 프로젝트 상하문을 이해하게 하고 있다.
    운영 체제 모듈에 관심이 있으시다면 previous post 더 많은 정보를 제공해 드리겠습니다.
    수입 순서가 매우 중요하므로 반드시 변하지 않도록 주의해 주십시오.
    만약 우리가 다시 스크립트를 실행한다면, 모든 사용자는 터미널에 인쇄해야 한다👯‍♂️.
    다음에posts라는 프로그램을 실행django-admin startapp posts하여 초기화합니다.
    이 프로그램은 우리의 블로그 게시물 모델을 수용할 것이다.

    이 예에 대해 우리는 명령줄에서 블로그 글을 만드는 실례를 만들 것이다.스크립트를 초기화하고 create_post.py



    import os
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'commands.settings')
    
    import django
    django.setup()
    
    from django.contrib.auth import get_user_model
    from posts.models import Category, Post
    
    User = get_user_model()
    
    def select_category():
        # retrieve categories. (You can create some examples from the django admin)
        categories = Category.objects.all().order_by('created_at')
        print('Please select a category for your post: ')
        for category in categories:
            print(f'{category.id}: {category}')
        category_id = input()
        category = Category.objects.get(id=category_id)
        return category
    
    
    def select_author():
        # retrieve all users
        users = User.objects.all()
        print('Please select an author for your post: ')
        for user in users:
            print(f'{user.id}: {user}')
        user_id = input()
        user = User.objects.get(id=user_id)
        return user
    
    
    
    def create_post():
        title = input("Title of your post: ")
        content = input("Long post content: ")
        category = select_category()
        author = select_author()
        Post(**locals()).save()
        print('Post created successfully!')
    
    if __name__ == "__main__":
        create_post()
    

    여기서 우리는 블로그 게시물의 실례를 만들었다.우리가 대외 관계를 어떻게 처리하는지 주의해야 합니까?관련 DB 테이블의 객체 인스턴스를 이 필드에 할당해야 합니다


    python create_post를 실행합니다.py, 그리고 정보를 입력하라고 알림


    사용자 정의django 관리 명령 방법을 작성합니다.


    상술한 바와 같이django 관리 명령은 실행python manage.py command_name을 통해 실행됩니다. 예를 들어runserver, migrate and collectstatic.사용 가능한 명령 목록을 보려면 실행python manage.py help

    이것은 사용 가능한 명령의 목록과 그들이 있는django 응용 프로그램 폴더를 표시합니다


    사용자 정의 관리 명령을 등록하려면 django 응용 프로그램 폴더에 management\commands 디렉터리를 추가하십시오

    우리의 예에서는 POST\관리\명령에 나타납니다


    설정을 마치면commands 폴더에서 사용자 정의 스크립트를 초기화할 수 있습니다.첫 번째 예에서는 이전에 작성한 블로그 게시물을 게시된 것으로 표시하는 명령을 작성합니다


    이를 위해 파일을 만들고 publish_post.py



    from django.core.management.base import BaseCommand, CommandError
    from posts.models import Category, Post
    
    class Command(BaseCommand):
        help = 'Marks the specified blog post as published.'
    
        # allows for command line args
        def add_arguments(self, parser):
            parser.add_argument('post_id', type=int)
    
        def handle(self, *args, **options):
            try:
                post = Post.objects.get(id=options['post_id'])
            except Post.DoesNotExist:
                raise CommandError(f'Post with id {options["post_id"]} does not exist')
            if post.published:
                self.stdout.write(self.style.ERROR(f'Post: {post.title} was already published'))
            else:
                post.published = True
                post.save()
                self.stdout.write(self.style.SUCCESS(f'Post: {post.title} successfully published'))
    

    Django 관리 명령은command라는 클래스로 구성되어 있으며, 이 클래스는 BaseCommand에서 계승됩니다


    파라미터를 처리하기 위해 이 종류를 이용argparse.이 방법add_arguments은 우리의 함수 수신 매개 변수를 허용합니다


    우리의 예에서 함수는 매개 변수가 필요합니다. 이 매개 변수는 분배키post_id


    그리고 handle() 함수 평가 입력 및 우리의 논리 실행


    전례에서 예기한 매개 변수 유형을 위치 매개 변수라고 하는데, 함수를 실행하려면 이 매개 변수를 제공해야 합니다

    이를 위해 python manage.py publish_post 1 (or any post primary key)

    실행

    선택할 수 있는 매개 변수라고 불리는 또 다른 매개 변수는 방법에 응용할 수 있다. 말 그대로 이 매개 변수가 부족하면 함수의 집행을 방해하지 않는다


    아래에 예시를 제공했다.파일을 초기화하고 이름을 edit_post.py 로 지정합니다.다음 코드로 채우기



    from django.core.management.base import BaseCommand, CommandError
    from posts.models import Category, Post
    
    class Command(BaseCommand):
        help = 'Edits the specified blog post.'
    
        def add_arguments(self, parser):
            parser.add_argument('post_id', type=int)
    
            # optional arguments
            parser.add_argument('-t', '--title',type=str, help='Indicate new name of the blog post.')
            parser.add_argument('-c', '--content',type=str, help='Indicate new blog post content.')
    
        def handle(self, *args, **options):
            title = options['title']
            content = options['content']
            try:
                post = Post.objects.get(id=options['post_id'])
            except Post.DoesNotExist:
                raise CommandError(f'Post with id {options["post_id"]} does not exist')
    
            if title or content:
                if title:
                    old_title = post.title
                    post.title = title
                    post.save()
                    self.stdout.write(self.style.SUCCESS(f'Post: {old_title} has been update with a new title, {post.title}'))
                if content:
                    post.content = content
                    post.save()
                    self.stdout.write(self.style.SUCCESS('Post: has been update with new text content.'))
            else:
                self.stdout.write(self.style.NOTICE('Post content remains the same as no arguments were given.'))
    

    여기서 우리는 단지 블로그 게시물의 제목이나 내용을 편집할 뿐이다

    이를 위해, 우리는 제목을 편집하기 위해 python manage.py edit_post 2 -t "new title" 을 실행할 수 있습니다


    또는 python manage.py edit_post 2 -c "new content"

    내용만 편집

    만약 우리가 python manage.py edit_post 2 -t "new title again" -c "new content again"를 통해 제목과 내용을 편집하기를 원한다면, 우리는 이 두 개의 매개 변수를 제공할 수 있다


    추가 자원


    1. Django docs
    2. Simple is better than complex

    이것은 내가 너에게 준 것이다. 만약 너에게 무슨 문제가 있다면, 나는 줄곧 개방할 것이다

    좋은 웹페이지 즐겨찾기