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函數是用來接收可選參數的

import os, sys
import hmac
import datetime

from .db_output_path import out_dir
from django.core.management import BaseCommand
from django.conf import settings


class Command(BaseCommand):
    help = """備份默認 db"""

    def __init__(self, *args, **kwargs):
        self.OUT_DIR = out_dir()
        now = datetime.datetime.now()
        self.OUT_FILE = os.path.join(self.OUT_DIR, now.strftime('mysql_full_%F.sql.xz'))
        return super(Command, self).__init__(*args, **kwargs)

    def add_arguments(self, parser):
        parser.add_argument('table_names', nargs='*', type=str)

    def handle(self, table_names, *args, **options):
      
        print('find "%s" -name "*.sql.xz" -mtime +30 -delete' % self.OUT_DIR)

可選參數

可使用add_argument()方法:

add_argument:讀入命令行參數,該調用有多個參數

ArgumentParser.add_argument(name or flags…[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

name or flags:是必須的參數,該參數接受選項參數或者是位置參數(一串文件名)

parser.add_argument('-f', '--foo')    #選項參數  
parser.add_argument('bar')        #位置參數  

nargs: 當選項后接受多個或者0個參數時需要這個來指定
比如-u選項接受2個參數 

>>> parser.add_argument('-u',nargs=2)  
>>> parser.parse_args('-u a b'.split())  
Namespace(u=['a', 'b'])  

當選項接受1個或者不需要參數時指定nargs=’?',當沒有參數時,會從default中取值。對於選項參數有一個額外的情況,就是出現選項而后面沒有跟具體參數,那么會從const中取值  

[python] view plaincopy

>>> parser.add_argument('-u',nargs='?')  
>>> parser.parse_args(''.split())  
Namespace(u=None)  
>>> parser.parse_args('-u a'.split())  
Namespace(u='a')  
  
>>> parser.add_argument('-u',nargs='?',default='d')  
>>> parser.add_argument('A',nargs='?',default='e')  
>>> parser.parse_args(''.split())  
Namespace(A='e', u='d')  
>>> parser.parse_args('-u'.split())  
Namespace(A='e', u=None)  
  
>>> parser.add_argument('-u',nargs='?',default='d',const='s')  
>>> parser.add_argument('A',nargs='?',default='T',const='P')  
>>> parser.parse_args(''.split())  
Namespace(A='T', u='d')  
>>> parser.parse_args('-u'.split())  
Namespace(A='T', u='s')  
>>> parser.parse_args('A'.split())  
Namespace(A='A', u='d')  

而對於后面需要跟多個參數的情況(–foo a1 a2 a3…),則需要設置nargs=’*’

>>> parser.add_argument('-u',nargs='*')  
>>> parser.parse_args('-u a b c d e'.split())  
Namespace(u=['a', 'b', 'c', 'd', 'e']) 

nargs=’+'也和nargs=’*'一樣,但是有一個區別當’+'時少於1個參數(沒有參數)位置參數會報錯誤

>>> parser.add_argument('u',nargs='+')  
>>> parser.parse_args(''.split())  
usage: [-h] u [u ...]  
: error: too few arguments  

而‘*’會使用默認值

>>> parser.add_argument('u',nargs='*',default='e')  
>>> parser.parse_args(''.split())  
Namespace(u='e')  

default: 當參數需要默認值時,由這個參數指定,默認為None,當default=argparse.SUPPRESS時,不使用任何值

>>> parser.add_argument('u',nargs='*',default=argparse.SUPPRESS)  
>>> parser.parse_args(''.split())  
Namespace()  

type: 使用這個參數,轉換輸入參數的具體類型,這個參數可以關聯到某個自定義的處理函數,這種函數通常用來檢查值的范圍,以及合法性

>>> parser.parse_args('-u',type=int)  
>>> parser.add_argument('f',type=file)  
>>> parser.parse_args('-u 2 aa'.split())  
Namespace(f='aa', mode 'r' at 0x8b4ee38>, u=2)  

choices: 這個參數用來檢查輸入參數的范圍

>>> parser.add_argument('-u',type=int,choices=[1,3,5])  
>>> parser.parse_args('-u 3'.split())  
Namespace(u=3)  
>>> parser.parse_args('-u 4'.split())  
usage: [-h] [-u {1,3,5}]  
: error: argument -u: invalid choice: 4 (choose from 1, 3, 5)

required: 當某個選項指定需要在命令中出現的時候用這個參數

>>> parser.add_argument('-u',required=True)  
>>> parser.parse_args(''.split())  
usage: [-h] -u U  
: error: argument -u is required  

help: 使用這個參數描述選項作用

>>> parser.add_argument('-u',required=True,default='wowo',help='%(prog)s for test sth(default: %(default)s)')  
>>> parser.print_help()                                                        usage: [-h] -u U  
  
optional arguments:  
  -h, --help  show this help message and exit  
  -u U        for test sth(default: wowo)

dest: 這個參數相當於把位置或者選項關聯到一個特定的名字

>>> parser.add_argument('--str',nargs='*')  
>>> parser.parse_args('--str a b c'.split())  
Namespace(str=['a', 'b', 'c'])  
  
>>> parser.add_argument('--str',nargs='*',dest='myname')  
>>> parser.parse_args('--str a b c'.split())  
Namespace(myname=['a', 'b', 'c'])  

metavar: 這個參數用於help 信息輸出中 

>>> parser.add_argument('--str',nargs='*',metavar='AAA')  
>>> parser.print_help()  
usage: [-h] [--str [AAA [AAA ...]]]  
  
optional arguments:  
  -h, --help            show this help message and exit  
  --str [AAA [AAA ...]]  
  
>>> parser.add_argument('str',nargs='*',metavar='AAA')  
>>> parser.print_help()  
usage: [-h] [AAA [AAA ...]]  
  
positional arguments:  
  AAA  
  
optional arguments:  
  -h, --help  show this help message and exit

     


免責聲明!

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



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