我正在编写一个Django应用程序,我期望使用许多management.py命令。我喜欢python函数的概念,它具有带默认值的参数,您可以在其中将参数定义为:
def function(param1=value1)
所以我正在编写管理命令,以便输入如下:
python manage.py createdb user=some_user db_name=some_name
据我所知,management.py命令不接受这种类型的参数列表,所以我创建了一个帮助程序来执行以下操作:
def process_args(args=None):
kwargs = {}
if not args:
return kwargs
for i in args:
try:
k,v = i.split('=')
kwargs[k] = v
except ValueError, ve:
raise CommandError("Please Enter All Arguments as key=value. e.g. user=admin")
return kwargs
有更好的方法吗?
答案 0 :(得分:12)
<强>更新强> 根据@rix,Django的更高版本现在使用argparse,这应该是首选。
原始答案:
我认为这里的标准方法是使用optparse,它可以挂钩解析Django已经使用的现有选项。示例from the 1.6 docs:
from optparse import make_option
class Command(BaseCommand):
option_list = BaseCommand.option_list + (
make_option('--delete',
action='store_true',
dest='delete',
default=False,
help='Delete poll instead of closing it'),
)
# ...
现在,您可以在options
字典中找到命令行参数。 Python文档说optparse
已被弃用,但我认为Django文档推荐它,因为它是Django用于自己的管理命令的东西。
答案 1 :(得分:5)
您可以使用典型的参数样式,而不是滚动自己的参数样式,并使用类似argparse
的内容来解析它:
python manage.py createdb --user=some_user --db_name=some_name
您只需定义参数解析器,然后将args
参数传递给其parse_args()
方法。
答案 2 :(得分:3)
@ Python argparse上的文档很棒,但是为了快速复制粘贴答案来解决原始问题(发布Django 1.8) - 请转到:
class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument(
'-something',
action='store',
dest='something',
default=None,
help="something",
)
def handle(self, *args, **options):
print(options['something'])
python manage.py your_command -something='something'