Ответ
В основе механизма сигналов 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.
Использование этого паттерна позволяет добавлять новую функциональность (очистка кэша, отправка уведомлений, логирование), не изменяя исходный код моделей или представлений.