Ответ
Сигналы в Django — это механизм, позволяющий компонентам приложения уведомлять друг друга о событиях и реагировать на них, не требуя при этом прямой связанности. Они реализуют паттерн "издатель-подписчик" (publisher-subscriber), что способствует слабой связанности кода и повышает его модульность.
Основные сценарии использования:
- Автоматизация действий: Выполнение операций при сохранении, удалении или изменении объектов модели (например, создание связанного профиля пользователя при регистрации).
- Логирование и аудит: Запись изменений в моделях или других событиях.
- Очистка кэша: Инвалидация кэша при обновлении данных.
- Отправка уведомлений: Уведомление пользователей или внешних систем о событиях.
- Интеграция: Взаимодействие с внешними сервисами после определенных действий.
Примеры встроенных сигналов:
pre_save
/post_save
: До/после сохранения объекта модели.pre_delete
/post_delete
: До/после удаления объекта модели.m2m_changed
: При изменении связей Many-to-Many.request_started
/request_finished
: В начале/конце обработки HTTP-запроса.
Пример: Автоматическое создание профиля пользователя:
# В файле signals.py или apps.py (для регистрации сигналов)
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User # Стандартная модель User
from .models import UserProfile # Ваша модель профиля
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
"""
Создает UserProfile при создании нового User.
"""
if created:
UserProfile.objects.create(user=instance)
# Важно: убедитесь, что сигналы зарегистрированы.
# Обычно это делается в методе ready() файла apps.py вашего приложения.
Сигналы позволяют расширять функциональность приложения без изменения исходного кода Django или сторонних библиотек, что делает их мощным инструментом для кастомизации и интеграции.