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:
Signaux de modèle
django.db.models.signals.pre_init
django.db.models.signals.post_init
django.db.models.signals.pre_save
django.db.models.signals.post_save
django.db.models.signals.pre_delete
django.db.models.signals.post_delete
django.db.models.signals.m2m_changed
django.db.models.signals.class_prepared
Signaux de gestion
django.db.models.signals.pre_migrate
django.db.models.signals.pre_syncdb
django.db.models.signals.post_migrate
django.db.models.signals.post_syncdb
Signaux de requête et de réponse
django.core.signals.request_started
django.core.signals.request_finishe
django.core.signals.got_request_exception
Signaux de test
django.test.signals.setting_changed
django.test.signals.template_rendered
Adaptateurs de base de données
django.db.backends.signals.connection_created
Vous trouverez plus d'infos sur les signaux de Django ici : Les signaux de base de Django