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