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