Django Signals

created:

updated:

tags: django

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.

References