如何编写自已的命令¶
Uliweb内置了一个命令系统,其中在uliweb/manage.py中已经内置了一些常用命令。同时 你也可以在某个app中,按照命令编写的要求来编写app相关的命令。这样一旦在settings.ini 中的 INSTALLED_APPS
里引入了这个app,这些命令就可以被 Uliweb 使用。你可以 输入 uliweb
来查看当前有哪些可用的命令。
下面就来介绍一下如何编写自已的命令。
创建commands.py文件¶
在你的app下创建一个commands.py的文件,文件结构如下:
from uliweb.core.commands import Command
from optparse import make_option
class DemoCommand(Command):
name = 'demo'
option_list = (
make_option('-d', '--demo', dest='demo', default=False, action='store_true',
help='Demo command demo.'),
)
help = ''
args = ''
check_apps_dirs = True
has_options = False
check_apps = False
def handle(self, options, global_options, *args):
print 'This is a demo of DemoCommand, you can enter: '
print
print ' uliweb help demo'
print
print 'to test this command'
print
print 'options=', options
print 'global_options=', global_options
print 'args=', args
以上是一个命令的示例,仔细解释一下。
命令类¶
类属性¶
每个命令都应该从Command类派生而来。这个类有几个属性可以覆盖,分别为:
- name
命令的名字。你将使用它来执行,执行方式如:
uliweb demo
- option_list
它是参数列表。定义形式为
optparse
所要求的格式。每个参数都使用make_option
来定义。它支持短参数和长参数。其中短参数就是类似-d
,长参数就是--demo
。dest
表示解析后的参数将使用的变量名。default
为缺省值。action
表示解析后的值如何存储,这里为store_true
,表示一旦给出参数,则将保存为True
。所以,这种方式会将参数解析为Boolean
值。那么如果要解析为字符 串怎么做,只要去掉action
即可,缺省就是字符串,这样可以在参数后面接收 参数。help
为此参数的帮助信息。- help
它会额外输出当前命令的帮助信息。用于对当前命令进行解释。
- args
将用在帮助信息的显示上。它与下面的
has_options
一起用在帮助信息的显示上。 对命令的执行没有影响。如果定义has_options
为True
,则命令帮助显示 为:uliweb demo [options] <args>
如果为
False
,则命令显示为:uliweb demo <args>
- has_options
用于帮助信息的显示。
- check_apps_dirs
用来显示是否检查当前目录下存在
apps
子目录。缺省为True
。- check_apps
用来检查app是否存在。如果设置为
True
,则假定传入的参数应该是 app 。这里 的参数是进行过命令行参数解析之后剩下的参数。
类方法¶
- def get_apps(self, global_options, include_apps=None)
返回当前项目所有app的清单。类似于uliweb中的get_apps,不过它因为使用了global_options 所以使用会更为简单
- def get_application(self, global_options)
根据配置信息创建一个application的实例,它会调用
make_simple_application
。- def handle(self, options, global_options, *args)
用于子类继承的方法。用户自定义的命令应该覆盖这个方法。
handler方法¶
handler方法是命令类的主体,它接三个参数:
- options
为本命令专有的参数,它是与类中的
option_list
的定义相对应的。- global_options
为命令全局参数。Uliweb的命令系统提供了缺省的全局参数,如
-h
,-v
等 参数。因此用户在定义自已的命令参数时,注意不要与全局的参数重复。- args
它就是参数解析之后剩下的参数。
常用在命令中的uliweb方法¶
- extract_dirs
从指定的模块的子目录下抽取相应的目录和文件到指定目录下。
from uliweb.utils.common import extract_dirs
函数定义为:
extract_dirs(module, path, dest_path, options)
- module
模块名。
- path
模块下的目录路径。
- dest_path
目标目录。
- options
可使用参数。如:
verbose=global_options.verbose
- get_apps
获得当前项目下所有的app名字
from uliweb import get_apps
函数定义为:
get_apps(apps_dir, settings_file, local_settings_file)
- apps_dir
当前项目下的apps目录。使用时如:
global_options.apps_dir
- settings_file
settings.ini文件路径。使用时如:
global_options.settings
- local_settings_file
local_settings.ini文件路径,使用时如:
global_options.local_settings
常用global_options属性¶
- verbose
对应于
-v
参数。表示是否要冗余输出。- apps_dir
项目下的
apps
子目录。- project
项目目录。
- settings
当前项目的settings.ini文件。用户可以使用非settings.ini名字。
- local_settings
当前项目下的local_settings.ini文件。用户可以使用非local_settings.ini名字。
Command类¶
Command
类是所有命令的基类。大多数方法请参见 uliweb/core/commands.py
文件。 其中有 get_apps
方法,功能和uliweb中的一样,不过需要传入的参数不同,如:
- get_apps
get_apps(global_options, include_apps=None)
使用起来比uliweb下的get_apps要简单一些。
- get_application
get_application(global_options)
获得当前应用的实例,它将完成整个应用的初始化工作
模块方法¶
- get_answer(message, answers='Yn', default='Y', quit='n')
从命令行获得一个应答。
- message
提示信息
- answers
为待提受的可选字符集合
- default
为输入回车时的缺省值
- quit
为退出输入字符
示例:
ans = get_answer(message, answers='Yn', quit='q')
- get_input(prompt, default=None, choices=None, option_value=None)
判断命令行参数值是否存在,如果不存在则在命令行提示用户输入
- prompt
提示信息
- default
按回车时的缺省值
- choices
可选输入值的范围
- option_value
命令输入的可选项,如果不为None,则会直接返回
示例:
get_input(prompt, default=url_prefix, option_value=options.url) get_input("Creation Theme([a]ngularjs):", default="a", choices=['a'], option_value=options.theme)