Opened 23 months ago

Last modified 23 months ago

#27747 new New feature

Add signals for Django management commands

Reported by: Dmitry Gladkov Owned by: nobody
Component: Core (Management commands) Version: master
Severity: Normal Keywords:
Cc: Triage Stage: Someday/Maybe
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no


Related PR:

Suggested example usage (I know that a string can't be a signal sender, this is just for illustrating the point):

from import signals

def handle_pre(sender, instance):
    instance.stdout.write('Hello World')

def handle_post(sender, instance):
    instance.stdout.write('Bye World')

signals.pre_command.connect(handle_pre, sender='runserver')
signals.post_command.connect(handle_post, sender='runsever')


Currently overriding of commands in Django can only be achieved by shadowing existing commands using INSTALLED_APPS initialization order. This is a perfectly good solution if a user needs to completely override a command, but it's not ideal for extending/adding functionality to existing commands. Extending the same command from different apps will not work as only the extended command from the latest INSTALLED_APPS entry will run (see Example 2).

Some examples of actions that can be achieved using singals:

  1. Pulling remote translations before compilemessages.
  2. Showing coverage or/and generating xml report after test.
  3. Running optipng on collected static images after collectstatic
  4. Displaying useful information like outdated package versions before runserver.

Change History (1)

comment:1 Changed 23 months ago by Tim Graham

Triage Stage: UnreviewedSomeday/Maybe

I'd like to see a consensus on the DevelopersMailingList before accepting this feature. Adam already offered an opinion, "If there are other use cases I think they'd also normally be better handled by more specific signals, e.g. post_migrate, rather than a generic all-commands signal." but this should be proposed on a separate thread.

Note: See TracTickets for help on using tickets.
Back to Top