Ответ
Сигналы в Django — это реализация паттерна 'Наблюдатель' (Observer), которая позволяет 'слабосвязанным' компонентам системы получать уведомления о событиях, происходящих в других частях фреймворка. Это помогает выполнять действия в ответ на определенные события, не изменяя исходный код, который их инициирует.
Основные встроенные сигналы можно сгруппировать по источникам:
1. Сигналы моделей (django.db.models.signals)
Срабатывают в ответ на события жизненного цикла моделей:
pre_save/post_save: перед/после вызова методаsave().pre_delete/post_delete: перед/после вызова методаdelete().m2m_changed: при измененииManyToManyField.
2. Сигналы жизненного цикла запроса (django.core.signals)
Связаны с обработкой HTTP-запросов:
request_started/request_finished: в начале и в конце обработки запроса.got_request_exception: при возникновении исключения во время обработки запроса.
3. Сигналы миграций (django.db.models.signals)
Срабатывают до и после применения миграций:
pre_migrate/post_migrate.
Пример использования
Для подключения обработчика сигнала используется декоратор @receiver.
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
# Эта функция будет вызвана каждый раз после сохранения объекта User
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
"""
sender - класс модели (User)
instance - конкретный экземпляр модели, который был сохранен
created - булево значение, True если объект был создан
"""
if created:
print(f"Создан новый пользователь: {instance.username}")
Кроме встроенных, разработчики могут создавать и отправлять собственные сигналы для организации взаимодействия между компонентами своего приложения.