Какой архитектурный паттерн лежит в основе сигналов в Django?

Ответ

В основе механизма сигналов Django лежит классический архитектурный паттерн Наблюдатель (Observer).

Этот паттерн позволяет реализовать слабую связанность между компонентами системы. Одни части системы (Publishers или Senders) генерируют события (сигналы), не зная, кто на них отреагирует. Другие части (Subscribers или Receivers) подписываются на эти события и выполняют определенный код при их возникновении.

Компоненты в Django:

  • Издатель (Sender): Объект, инициирующий событие. Например, модель Django при сохранении (sender=MyModel).
  • Сигнал (Signal): Сам объект события, например, post_save.
  • Подписчик (Receiver): Функция или метод, который "слушает" сигнал и выполняется при его отправке. Обычно декорируется с помощью @receiver.

Практический пример:

Предположим, нам нужно очищать кэш профиля пользователя каждый раз после его обновления.

from django.core.cache import cache
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User

# Эта функция - 'Подписчик' (Receiver)
@receiver(post_save, sender=User)
def clear_user_profile_cache(sender, instance, **kwargs):
    """Очищает кэш при обновлении объекта User."""
    print(f"Сигнал post_save для пользователя {instance.username}. Очистка кэша...")
    cache.delete(f'user_profile_{instance.id}')

# Когда где-то в коде выполнится user.save(),
# Django автоматически вызовет функцию clear_user_profile_cache.

Использование этого паттерна позволяет добавлять новую функциональность (очистка кэша, отправка уведомлений, логирование), не изменяя исходный код моделей или представлений.