Signaux Django

Django propose un service de distributeur de signaux (Django Signals en anglais) qui permet de récupérer des actions executées ailleurs dans un projet.

Le système permet d'envoyer des informations depuis un sender vers un ensemble de receivers. Cela permet l'interception d'une action, par exemple si un mouvement de stock a lieu on peut y être averti quelque soit l'endroit du code. C'est d'ailleurs cet exemple que nous allons étudier ci-après:

# signals.py

import django.dispatch

post_stock_move = django.dispatch.Signal(providing_args=["q"])
# url.py

import myapp.receivers
# receivers.py

from django.dispatch import receiver
from myapp.signals import post_stock_move

@receiver(post_stock_move)
def my_callback(sender, **kwargs):
  # Faire Qqqch
  print kwargs['q']
# models.py

from myapp.signals import *

class ProductItem(models.Model):
    code = models.CharField(max_length=255)
    
    def move(self, quantity):
        post_stock_move.send(sender=self, q=quantity)

Les signaux de base de Django

Django propose toute une liste de signaux prêt à l'emploi comme les signaux pre_save et post_save qui vous permettent de lancer une action avant et après un enregistrement en base.

Dans l'exemple ci-après nous allons faire une action après l'enregistrement en base

# url.py

import myapp.receivers
# receivers.py

from django.dispatch import receiver
from django.db.models.signals import post_save
from myapp.models import Product

@receiver(post_save)
def my_callback(sender, **kwargs):
    if issubclass(sender, Product):
        print "Le produit {0} a été enregistré! ".format( kwargs['instance'].id, )

Voici les signaux Django disponibles:

Vous trouverez plus d'infos sur les signaux de Django ici : Les signaux de base de Django