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