zoukankan      html  css  js  c++  java
  • 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
    

         

    I can feel you forgetting me。。 有一种默契叫做我不理你,你就不理我

  • 相关阅读:
    学到了林海峰,武沛齐讲的Day63 网页制作思路 Toando 自定义form验证
    学到了林海峰,武沛齐讲的Day62 SONP实现AJax跨域 Iframe文件上传
    学到了林海峰,武沛齐讲的Day60 Form组件中的源码添加详解 gjango序列化 数据库取值转换
    学到了林海峰,武沛齐讲的Day59 Form组件
    学到了林海峰,武沛齐讲的Day58 分页 初识Form
    学到了林海峰,武沛齐讲的Day57 表单实战讲解
    学到了林海峰,武沛齐讲的Day56 表单实战讲解
    学到了林海峰,武沛齐讲的Day58 分页 form表单
    最详细的正则(转载)
    爬虫笔记(二):爬取药监局所有详情页数据
  • 原文地址:https://www.cnblogs.com/weidaijie/p/11718336.html
Copyright © 2011-2022 走看看