Django--自定义 Command 命令

Django 对于命令的添加有一套规范,你能够为每一个app 指定命令。通俗一点讲,好比在使用manage.py文件执行命令的时候,能够自定制本身的命令,来实现命令的扩充。

commands的建立python

一、在app内建立一个management的python目录
二、在management目录里面建立commands的python文件夹
三、在commands文件夹下建立任意py文件

此时py文件名就是你的自定制命令,能够使用下面方式执行django

python manage.py 命令名

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

 python2环境中,请确保management和management/commands目录内都包含__init__.py文件ruby

 

首先对于文件名没什么要求,内部须要定义一个Command类并继承BaseCommand类或其子类。

它必须定义一个Command类并扩展自BaseCommand或其 子类。app

其中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()方法:spa

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里面直接取参数就能够了。code

方法

返回django版本号:BaseCommand.get_version() 
命令的真正逻辑。子类必须实现这个方法。:BaseCommand.handle()blog

BaseCommand的子类

class LabelCommand

 

这个管理命令接收命令行上的一个或多个参数(标签),并对它们每个都作一些动做。

子类不用实现handle(),但必须实现handle_label(),它将会为每一个标签调用一次。

LabelCommand.handle_label(label, **options)

 

对label完成命令行的动做,label是命令行给出的字符串。

相关文章
相关标签/搜索