✅ Решения — Урок 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, используется в тестах