Что такое сигналы в 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: при возникновении исключения во время обработки запроса.

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}")

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