Отправка модели User в задачу Celery

Передавайте account.pk, а не экземпляр User. Стандартный JSON-сериализатор Celery не поддерживает ORM-модель; worker должен заново получить пользователя и проверить актуальное состояние.

Короткий ответ

Что ответить на собеседовании

Передавайте account.pk, а не экземпляр User. Стандартный JSON-сериализатор Celery не поддерживает ORM-модель; worker должен заново получить пользователя и проверить актуальное состояние.

Подробный разбор

Ответ с пояснениями

Условие

Проверьте, как правильно передать объект модели пользователя в асинхронную задачу Celery с помощью метода .delay(). Оцените, какие проблемы могут возникнуть при сериализации ORM‑объекта и какие потенциальные угрозы безопасности стоит учитывать.

from django.contrib.auth import get_user_model

User = get_user_model()
account = User.objects.get(id=1)

change_user_status.delay(account)

Ответ

Передавайте account.pk, а не экземпляр User. Стандартный JSON-сериализатор Celery не поддерживает ORM-модель; worker должен заново получить пользователя и проверить актуальное состояние.

Пример вызова: change_user_status.delay(account.pk). Если пользователь создан в незавершённой транзакции, enqueue перенесите в transaction.on_commit. Задача обрабатывает отсутствие записи и допускает повторный запуск без повторного нежелательного эффекта.

Не включайте pickle только ради удобства сериализации модели: недоверенное сообщение может привести к выполнению кода. Ограничьте доступ к брокеру и принимаемые сериализаторы. Передача id также исключает ненужное копирование полей пользователя в очередь, но сама по себе не заменяет проверку полномочий в точке постановки задачи.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее