Signals
In a nutshell, signals allow certain senders to notify a set of receivers that some action has taken place. They’re especially useful when many pieces of code may be interested in the same events.
Listening to signals
How to receive a signal
To receive a signal, register a receiver function using the
Signal.connect()
method. The receiver function is called when the signal is sent. All of the signal’s receiver functions are called one at a time, in the order they were registered.
How to define receiver functions
A receiver can be any Python function or method with the signature my_callback(sender, **kwargs)
def my_callback(sender, **kwargs):
print("Request finished!)
How to connect receiver functions
1) Manual route
from django.core.signals import request_finished
request_finished.connect(my_callback)
2) Decorator
from django.core.signals import request_finished
from django.dispatch import receiver
@receiver(request_finished)
def my_callback(sender, **kwargs):
print("Request finished!)
Connect to signals sent by specific senders
For instance, we can listen to signals sent by a specific model (ex: django.db.models.signals.pre_save
).
The following example registers my_handler
to pre_save
signal sent by MyModel
.
from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import MyModel
@receiver(pre_save, sender=MyModel)
def my_handler(sender, **kwargs):
...
Defining signals
All signals are
django.dispatch.Signal
instances.
import django.dispatch
pizza_done = django.dispatch.Signal()
Sending Signals
Signal.send(sender, **kwargs)
All built-in signals use this way. sender
is a required argument.
Disconnecting Signals
Signal.disconnect()
The method returns True
if a receiver is disconnected. It returns False
if not.