Les signaux avec Django

Comme souvent les choses les plus simples sont mal expliquées. J’ai pris trop de temps pour apprendre le fonctionnement des signaux sous Django malgré la simplicité de ceux-ci. N’ayant trouvé que des exemples partiels et mal expliqués, je vous propose donc un exemple minimal de la création et de l’utilisation d’un signal avec Django.

Pour la suite de cet exemple on va supposer que l’application dans laquelle nous créons et utilisons nos signaux s’appelle “NameApp”.

Dans un premier temps, créons un nouveau signal et un récepteur pour le signal dans le fichier signals.py:

from django.dispatch import Signal
from django.dispatch import receiver

# creation of a new signal named test_signal
test_signal = Signal()

# the decorator is used to connect the fonction to the signal we just created
@receiver(test_signal)
def test_signal_handler(sender, **kwargs):
    return "success"

Nous créons ensuite un simple test pour pouvoir vérifier si tout fonctionnera correctement. Dans le ficher test.py ajoutez:

from django.test import TestCase
from nameapp.signals import test_signal

class SignalHandlerTestCase(TestCase):

    def test_test_signal_handler(self):
        # we send the signal and check is the result is equal to the result of test_signal_handler
        res = test_signal.send(sender=type(int))
        self.assertEqual("success", res[0][1])

Si vous testez votre code juste après cette étape (avec “python manage.py test”) vous devriez avoir une erreur. En effet votre application utilise une configuration par défaut qui ne gère pas les signaux. Il faut créer une nouvelle configuration permettant d’utiliser des signaux dans le ficher apps.py:

from django.apps import AppConfig

class NameAppConfig(AppConfig):
    # we give the same name to this app than the default one
    name = 'nameapp'

    # ready is used to add step at the app initialisation 
    def ready(self):
        # we import all things define in our signals.py file, we could import only test_signal_handler
        from nameapp import signals

Il suffit ensuite de “dire à Django” d’utiliser la configuration que nous venons de créer. Pour cela il suffit d’ajouter une ligne dans le ficher __init__.py:

default_app_config = 'nameapp.apps.NameAppConfig'

Et voilà, c’est fait, vous avez un signal et un récepteur fonctionnel. Vous pouvez le vérifier en relançant le test.

Les signaux avec Django par La Réponse est 42 est sous Licence Creative Commons Internationale Attribution-Partage à l'identique 4.0.

Vous aimerez aussi...

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *