Как использовать `@transaction` для отката зарегистрированного пользователя в случае, если Email не удалось сгенерировать?

Я создаю простой django-rest-framework бэкенд, который использует dj-rest-auth систему аутентификации со следующими настройками

ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_EMAIL_VERIFICATION = 'mandatory'

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

Это моя serializer.py

class CustomRegisterSerializer(RegisterSerializer):
    first_name = serializers.CharField(max_length=30)
    last_name = serializers.CharField(max_length=30)

    @transaction.atomic
    def save(self, request):
        try:
            user = super().save(request)
            user.first_name = self.data.get('first_name')
            user.last_name = self.data.get('last_name')
            user.save()
            return user
        except <...What exception has to be caught?...>:
            transaction.set_rollback(True)
            return

Какое исключение я должен поймать и правильно ли я это делаю? Как мне этого добиться?

Для справки, вот ошибка, возникающая в случае неправильных значений в settings.py файле

Exception Type: ConnectionRefusedError at /api/auth/register/
Exception Value: [WinError 10061] No connection could be made because the target machine actively refused it

Также возможен ли откат в случае, если пользователь указал неправильный email и письмо не было доставлено?

@transaction.atomic выполнит транзакцию с базой данных, если ваше представление выдаст ответ без ошибок. Поскольку вы сами ловите исключение, Django кажется, что ваше представление выполнилось просто отлично.

Если вы поймали исключение, вам нужно обработать его самостоятельно. Вызовите исключение или верните ошибку.

Что касается второго вопроса, вы можете проверить электронную почту перед отправкой, также любая ошибка, связанная с отправкой электронной почты, вызовет ошибку.

Вернуться на верх