Django Signals

Сигналы — очень похожая реализация паттерна Pub-Sub в Django для общения между компонентами одного приложения.

В Django есть встроенные сигналы, на которые можно подписываться (например, изменение каких-нибудь настроек), а можно создавать свои сигналы

Пример встроенного сигнала:

from django.core.signals import setting_changed

Пример создания своего сигнала:

from django.dispatch import Signal

my_signal = Signal()

Подписаться на сигнал (стать receiver'ом в терминах Django):

from django.core.signals import setting_changed
def my_callback(sender, **kwargs):
    print("Request finished!")

setting_changed.connect(my_callback)

или через декоратор receiver():

from django.core.signals import setting_changed
from django.dispatch import receiver


@receiver(setting_changed)
def my_callback(sender, **kwargs):
    print("Setting changed!")

Отправить сигнал:

my_signal.send(sender=self.__class__, arg1=1, arg2="test", ...)

Полный пример

Например, мы хотим подписаться на событие сохранения нашей модели Django:

from django.db.models.signals import post_init, post_save
from django.dispatch import receiver

from my_model import MyModel


@receiver(post_save, sender=MyModel)
def my_receiver(sender, instance, created, **kwargs):
   # Если кто-то будет сохранять модель MyModel, то этот обработчик вызовется после обновления
   # проверяем поля instance (это будет типа MyModel), решаем что делать
   ...

Last updated