编写具有子命令的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的其他命令超类,如AppCommandLabelCommand(如果,事实上,它们还不起作用,如果有需求的话)
  • 我在给_subcommand()访问 整个argv并让它返回任何不用于执行的参数 派遣。结果事情变得复杂起来 好处。如果你觉得这个有用,请提交一个错误。

版本历史记录

0.1
第一次发布。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Android客户端服务器,Post请求   无需存储高度的java AVL树实现   java Drools,如果多个值中的一个不等于null,则将该值分配给变量   java在尝试使用springboot从POST请求体读取嵌套JSON时获取null   Android开发的java初学者遇到问题   java阻止WebView音频在屏幕关闭时超时   java日验证返回错误   java不兼容类型:无法将void转换为ArrayList<String>   java如何设置ContentDisposition标头中包含空格的文件名   java Hibernate进行正确的数据库查询,但返回空实体   java如何格式化输出?   java如何使用KMeans算法查找异常/异常值   java为什么在此程序中出现“找不到符号”错误?   java如何实现加权快速联合算法?   java使ListView可滚动   java如何使seekbar在用户按下或触摸之前处于非活动状态?   未在页脚JSP中加载fmt标记库的java资源   如何在Java中插入csv文件内容   使用jsonObject的JavaFacebookRESTFB停止获得喜欢数