✅ Решения — Урок 45

← К оглавлению урока

⚡ Ответы

  • Вопрос 1: б — механизм уведомлений о событиях
  • Вопрос 2: б — post_save
  • Вопрос 3: в — created
  • Вопрос 4: б — connect
  • Вопрос 5: б — receiver
  • Вопрос 6: в — в ready() AppConfig
  • Вопрос 7: б — console.EmailBackend

Разбор ответов

Вопрос 1 — Ответ: б) Механизм отправки и получения уведомлений о событиях

Сигналы Django — это механизм, позволяющий разным частям приложения реагировать на события (создание, обновление, удаление объектов) без прямой связи между компонентами. Это реализация паттерна «наблюдатель» (Observer / Publisher–Subscriber).

Почему остальные неверны:

  • а) Создание моделей — это классы, наследующие django.db.models.Model
  • в) Аутентификация — это JWT, TokenAuth, SessionAuth
  • г) Маршрутизация URL — это urls.py и path()

Вопрос 2 — Ответ: б) post_save

post_save отправляется после того, как объект сохранён в базе данных. Это значит, что instance.pk уже присвоен и доступен. Именно поэтому пример с созданием токена использует post_save, а не pre_save.

  • pre_save — до сохранения (объект ещё не в БД)
  • pre_delete / post_delete — при удалении, не при сохранении

Вопрос 3 — Ответ: в) created

Параметр created есть только у post_save. Его значение:

  • True — объект создан впервые (INSERT)
  • False — объект обновлён (UPDATE)
@receiver(post_save, sender=Book)
def on_book_save(sender, instance, created, **kwargs):
    if created:
        print("Новая книга создана!")
    else:
        print("Книга обновлена.")

sender — класс модели, instance — экземпляр, using — псевдоним БД.

Вопрос 4 — Ответ: б) connect

Метод .connect() позволяет явно зарегистрировать функцию-обработчик для сигнала:

post_save.connect(my_handler, sender=MyModel)

Это более многословно, чем декоратор @receiver, но полезно при динамической или условной регистрации. Обратная операция — .disconnect().

Вопрос 5 — Ответ: б) receiver

Декоратор @receiver импортируется из django.dispatch и принимает сигнал и (опционально) отправителя:

from django.dispatch import receiver
from django.db.models.signals import post_save

@receiver(post_save, sender=MyModel)
def my_handler(sender, instance, created, **kwargs):
    ...

Это не встроенный Python-декоратор — это специальный декоратор Django для работы с сигналами.

Вопрос 6 — Ответ: в) В методе ready() класса AppConfig (apps.py)

Правильное место для импорта signals.py — метод ready() в AppConfig:

class MyAppConfig(AppConfig):
    name = 'myapp'

    def ready(self):
        import myapp.signals

ready() вызывается ровно один раз после полной загрузки всех приложений Django. Это исключает циклические импорты и двойную регистрацию обработчиков.

Вопрос 7 — Ответ: б) console.EmailBackend

ConsoleEmailBackend выводит письмо в консоль сервера в виде текста — удобно для разработки и проверки шаблонов письма без настройки SMTP.

  • а) smtp.EmailBackend — реальная отправка, нужны SMTP-данные
  • в) dummy.EmailBackend — ничего не делает, даже в консоль не выводит
  • г) locmem.EmailBackend — хранит письма в django.core.mail.outbox, используется в тестах