Какие основные сигналы существуют в Django и для чего они используются?

Ответ

Сигналы в 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)

Этот код гарантирует, что у каждого нового пользователя будет связанный с ним профиль, при этом логика создания профиля отделена от логики создания пользователя.