Ответ
Сигналы в 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
: Срабатывает при возникновении исключения во время обработки запроса.
Практический пример: создание профиля пользователя
Классический пример использования сигнала post_save
— автоматическое создание объекта Profile
при регистрации нового пользователя (User
).
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile
# Декоратор @receiver связывает функцию-обработчик с сигналом
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
"""
Обработчик сигнала post_save для модели User.
- sender: Класс модели, отправивший сигнал (User).
- instance: Экземпляр модели, который был сохранен.
- created: Флаг, равный True, если была создана новая запись в БД.
"""
if created:
Profile.objects.create(user=instance)
Этот код гарантирует, что у каждого нового пользователя будет связанный с ним профиль, при этом логика создания профиля отделена от логики создания пользователя.