Как создать систему повторной отправки проверочного кода в Django?

У меня есть проблема, которая заключается в том, что каждый раз, когда пользователь создает свой аккаунт и не вводит свой код (это означает, что код истек), пользователь не может получить код снова, потому что аккаунт может быть создан один раз. Я хочу знать, как я могу изменить этот код таким образом, чтобы пользователь мог получать проверочный код снова и снова. serilizer.py:

class RegisterationSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True, required=True, help_text=_("Enter a valid password"))
    repeated_password = serializers.CharField(write_only=True, required=True, help_text=_("Enter your password again"))
    
    
    class Meta:
        model = User
        fields = ["email", "username", "name", "password", "repeated_password"]
        extra_kwargs = {
            'email': {'help_text': _("Enter your email")},
            'username': {'help_text': _("Enter your username")},
            'name': {'help_text': _("Enter your name"), 'required': False, 'allow_blank': True},
        }

    
    def validate(self, data):
        print(User.objects.filter(email=data["email"], is_active=False))
        if data["password"] and data["repeated_password"] and data["password"] != data["repeated_password"]:
            raise serializers.ValidationError(_("Password and repeated password must be the same"))
        if data["email"].strip() == data["username"].strip():
            raise serializers.ValidationError(_("Email and username must be different")) 
        return data

class ConfirmCodeSerializer(serializers.ModelSerializer):
    email = serializers.EmailField(write_only=True, max_length=220, min_length=6, help_text=_("Enter your email"))
    class Meta:
        model = VerficationCode
        fields = ["email","code"]
        extra_kwargs = {
            'email': {'help_text': _("Enter your email")},
            'code': {'help_text': _("Enter your code")},
        }

views.py:

class RegisterationApiView(APIView):
    """
    Get username, email, name, and password from the user
    and save it in the database
    """
    def post(self, request):
        if request.user.is_anonymous:
            data = RegisterationSerializer(data=request.data) 
            if data.is_valid(raise_exception=True):
                validated_data = data.validated_data
                del(validated_data["repeated_password"])
                user = User.objects.create_user(**validated_data)  
                verification_code = give_code()
                VerficationCode.objects.create(user=user, code=verification_code)
                send_mail("Verification Code", f"your code is: {verification_code}", "nima@gmail.com", [data.validated_data["email"]])
                return Response({
                "message": f'{data.validated_data["email"]} account was created successfully, your verification code has been sent to your email'
                }, status=status.HTTP_201_CREATED)
            
            else:
                return Response(data.errors, status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response({
                "message": "You're already authorized"
            }, status=status.HTTP_400_BAD_REQUEST) 

class ConfirmCodeApiView(APIView):
    def post(self, request):
        data = ConfirmCodeSerializer(data=request.data)
        if data.is_valid():
            user = User.objects.get(email=data.validated_data["email"])
            if user.is_active:
                return Response({
                    "message": "Your account is already confirmed"
                }, status=status.HTTP_400_BAD_REQUEST)
            else:
                code = VerficationCode.objects.get(user=user)
                if code.code == data.validated_data["code"] and VerficationCode.objects.nonexpired().filter(user=user).exists():
                    user.is_active = True
                    user.save()
                    return Response({
                        "message": "Your account has been confirmed"
                    }, status=status.HTTP_200_OK)
                else:
                    return Response({
                        "message": "Your code is incorrect or expired"
                    }, status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response(data.errors, status=status.HTTP_400_BAD_REQUEST)

Большое спасибо!

Вы можете добавить новое поле (столбец) в вашу модель пользователя :

 email_verified = models.BooleanField(default=False)

при регистрации проверьте, существует ли данный email уже в вашей базе данных или нет. если он не существует, это будет обычная регистрация, но если существует, проверьте, является ли email_verified истинным или ложным .

если это True, то регистрация вызовет ошибку запроса, так как электронная почта уже существует, но если это false, то пользователь не использовал код для верификации своего аккаунта .

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

надеюсь, это помогло .

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