Django--自定義 Command 命令


Django 對於命令的添加有一套規范,你可以為每個app 指定命令。通俗一點講,比如在使用manage.py文件執行命令的時候,可以自定制自己的命令,來實現命令的擴充。

commands的創建

1、在app內創建一個management的python目錄
2、在management目錄里面創建commands的python文件夾
3、在commands文件夾下創建任意py文件

此時py文件名就是你的自定制命令,可以使用下面方式執行

python manage.py 命令名

Django的Command命令是要放在一個app的management/commands目錄下的。

 python2環境中,請確保management和management/commands目錄內都包含__init__.py文件

 

首先對於文件名沒什么要求,內部需要定義一個Command類並繼承BaseCommand類或其子類。

它必須定義一個Command類並擴展自BaseCommand或其 子類。

其中help是command功能作用簡介,handle函數是主處理程序,add_arguments函數是用來接收可選參數的

from django.core.management.base import BaseCommand, CommandError
from polls.models import Poll  自己的

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

    def add_arguments(self, parser):
        parser.add_argument('poll_id', nargs='+', type=int)

    def handle(self, *args, **options):
        for poll_id in options['poll_id']:
            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('Successfully closed poll "%s"' % poll_id)

 

可選參數

可使用add_argument()方法:

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

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

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

 帶參數的測試:

# -*- coding: utf-8 -*-
# __author__ = 'dandy'
from django.core.management.base import BaseCommand

class Command(BaseCommand):

    def add_arguments(self, parser):
        parser.add_argument('aaa', nargs='+', type=int)
        parser.add_argument('--delete',
                            action='store_true',
                            dest='delete',
                            default=False,
                            help='Delete poll instead of closing it')

    def handle(self, *args, **options):
        print('test')
        print(args, options)

options里面直接取參數就可以了。

方法

返回django版本號:BaseCommand.get_version() 
命令的真正邏輯。子類必須實現這個方法。:BaseCommand.handle()

BaseCommand的子類

class LabelCommand

 

這個管理命令接收命令行上的一個或多個參數(標簽),並對它們每一個都做一些動作。

子類不用實現handle(),但必須實現handle_label(),它將會為每個標簽調用一次。

LabelCommand.handle_label(label, **options)

 

對label完成命令行的動作,label是命令行給出的字符串。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM