Django: split management commands into subfolders

℡╲_俬逩灬. 提交于 2020-04-08 04:38:24

问题


The Django management commands documentation shows all commands being created in an app/management/commands folder. Is it possible to put commands into subfolders, like app/management/commands/install and app/management/commands/maintenance? How would this be done?


回答1:


Unfortunatly, as of Django 1.4 there seems to be no way of doing that. The sources for django.core.management.__init__.py have this method:

def find_commands(management_dir):
    """
    Given a path to a management directory, returns a list of all the command
    names that are available.

    Returns an empty list if no commands are defined.
    """
    command_dir = os.path.join(management_dir, 'commands')
    try:
        return [f[:-3] for f in os.listdir(command_dir)
                if not f.startswith('_') and f.endswith('.py')]
    except OSError:
       return []

As you can see, it only considers files directly inside the commands folder, ignoring any subfolders. However, if you "monkey patch" this function somehow, the rest of the code should work fine, since the code that actually creates the Command instance is this:

def load_command_class(app_name, name):
    """
    Given a command name and an application name, returns the Command
    class instance. All errors raised by the import process
    (ImportError, AttributeError) are allowed to propagate.
    """
    module = import_module('%s.management.commands.%s' % (app_name, name))
    return module.Command()

So, if you had a command named subfolder.command it would load the right script and instantiate the right class.

From a practical standpoint, however, I see no use of doing that. Sure, having "namespace'd" commands would be nice, but you can always prefix all your commands with some name if you want, using something else as a separator (such as _). The command name length - and the number of keystrokes needed to type them in the terminal - will be the same...



来源:https://stackoverflow.com/questions/12125268/django-split-management-commands-into-subfolders

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!