编写具有子命令的django管理命令。
django-subcommander的Python项目详细描述
使用django子命令编写django管理命令 子命令,每个子命令都有自己不同的选项、帮助和其他 通常按命令行为。子命令只是普通的django BaseCommand子类,所以没有什么新的东西可以学习。这是一个 示例顶级命令;您可以将其放在应用程序的 management.commands.desserts模块:
from django_subcommander import SubcommandDispatcher class Command(SubcommandDispatcher): """The top-level "dessert" command which has several subcommands""" help = 'Eat, top, and do various things with desserts.' args = '<subcommand> [more arguments and options]' def _subcommand(self, name): """ Return a management command that implements the subcommand of the given name. """ if name == 'eat': return EatCommand() elif name == 'top': ,,, class EatCommand(BaseCommand): # You could put this in another module or wherever you want. help = 'Eat a dessert.' args = '[number of bites]' # Add options here with make_option(), in the usual way. def handle(self, *args, **options): ...
调用子命令以在5口中吃甜点…
./manage.py dessert eat 5
查看eat子命令的帮助…
./manage.py dessert eat --help
查看顶级命令的帮助…
./manage.py dessert --help
如果您实现了 _subcommand_names:
class Command(SubcommandDispatcher): ... def _subcommand(self, name): ... def _subcommand_names(self): """Return a list of the names of all the subcommands.""" return ['eat', 'top']
然后,./manage.py dessert --help将产生如下结果:
Usage: ... Options: ... Subcommands: eat [number of bites] top <topping> [more toppings]
疯狂的东西
- 注意,_subcommand()返回的是命令实例,而不是类或 模块路径。这不仅使您可以自由地放置子命令 无论您希望在哪里编写代码,但这也意味着您可以生成或参数化 子命令在运行时动态执行。
- 你没有理由不能有一个SubcommandDispatcher 返回另一个,从而实现多级子命令。
设计说明
django的管理命令框架构建在optparse之上,而不是更多 现代的argparse,它本机支持子命令。那将是一个相当 使用django的管理命令获得argparse的一点粘合 基础设施,所以我选择了简单的道路。这让作者可以重用所有内容 他们已经知道如何编写django管理命令。例如,我有 几组预先存在的命令,我想在一小部分中组织起来。 子命令。这让我避免了在 management/commands;它给了我查找所有命令代码的自由 在其他地方,以更自然的方式组织它。把命令变成 子命令根本不需要对它们进行任何更改。
django subcommander绝对是一个“越差越好”的解决方案。这是解决management/commands中大量文件的一个非常实用的解决方案。如果结果是长而复杂的,我可能会操纵django来支持基于argparse的命令……嗯,那么让一个基于argparse的basecommand替代品怎么样?
未来计划
- 测试。我已经用了一整天了,但我只是在“原地”测试。
- 在获取子命令列表时更灵活 --help在顶级命令上
- 支持django的其他命令超类,如AppCommand和 LabelCommand(如果,事实上,它们还不起作用,如果有需求的话)
- 我在给_subcommand()访问 整个argv并让它返回任何不用于执行的参数 派遣。结果事情变得复杂起来 好处。如果你觉得这个有用,请提交一个错误。
版本历史记录
- 0.1
- 第一次发布。