Django: What exactly are signals good for?

Django Signals are a way to perform an action A in response to an event E.

In a unreal world you can avoid using signals by modifying the code where the event E occurs and appending the code to perform the action A.

The problem is that doing so you loose maintainability, readability and a lot of other software engineering adjectives :)

Signals allow you to do the same thing indipendently from where or how the event E occurs and so doing so in a clever way that allow maintanability, readability, etc...

Yes, I think that saying that Signals are useful to enable decoupling is really true.

(You also mentioned multi threading. If you did so because you think signals are good because they are executed concurrently and so quickly... Well... I don't know if they are concurrently executed but anyway I really don't think this is the point for what django signals are useful for)

An example of a good way of taking advantage of Signals is about the fact that when you want to store other information to an user in django you have to use Userprofiles. In this case, the documentation itself, tell you that it may be convenient to register a signal in response to any creation of new users just to add to the new created users an empty user profile.


Here is an example that may help.

Suppose you need to perform some action when a model instance is saved. However, this action has got nothing to do with the model or model instance itself directly. Therefore it makes little sense to put the code for your action in a save() method on the model. It would cause unnecessary code coupling and clutter. Instead you can create a signal handler somewhere else in your application (or even in another application) where it makes more sense.


I would perform Tasks 2 and 3(the images stuff) with something like an asynchronous task queue, like Celery

That's similar to multithreading.