Ответ
Сигналы в 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}")
Кроме встроенных, разработчики могут создавать и отправлять собственные сигналы для организации взаимодействия между компонентами своего приложения.