Как проверить равенство кода проверки электронной почты в django rest framework?

Я пытаюсь создать проверку электронной почты для моего сайта с помощью django rest framework. Механизм выглядит следующим образом:

  1. User enters his email and presses continue button
  2. He gets a 6 digit verification code
  3. He enters the 6 digit code that he received
  4. If the code is valid he goes to next step and else an error occurs

Моя проблема заключается в шаге 4. Я не знаю, как проверить равенство проверочного кода, потому что я не могу получить его из шага 2.

Ниже приведены мои коды. Я буду очень рад, если кто-нибудь сможет помочь мне решить эту проблему:)

serializers.py

class CodeSerializer(serializers.Serializer):
    code = serializers.IntegerField()

class EmailSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ['email', ]

methods.py

import random
from django.conf import settings
from django.core.mail import send_mail

def generate_activation_code():
    return int(''.join([str(random.randint(0,10)) for _ in range(6)]))

def send_verification_mail(email):
    
    generated_code = generate_activation_code()
    subject = 'Sinjim verification code'
    message = f'Your verification code:\n{generated_code}\nThanks for using sinjim.'
    from_email = settings.EMAIL_HOST_USER
    recipient_list=[email, ]
    send_mail(subject, message, from_email, recipient_list)

views.py

class EmailView(APIView):

    def post(self, request, format=None):
        serializer = EmailSerializer(data=request.data)
        if serializer.is_valid():
            email = serializer.validated_data['email']
            methods.send_verification_mail(email)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class CodeView(APIView): 

    def post(self, request, format=None):
        serializer = CodeSerializer(data=request.data)
        code2 = methods.generate_activation_code()
        if serializer.is_valid():
            if serializer.validated_data['code'] == code2:
                return Response({'message':'equal'})
            else:
                return Response({'message':'not equal'})
        else:
            print(serializer.errors)
            return Response({'message': 'Serializer is not valid'})

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

Спасибо

Вот что отсутствует в вашем коде,

  1. Пользователь вводит свой e-mail и нажимает кнопку продолжить

  2. Бэкэнд получает электронную почту и генерирует 6-значную верификацию для этой электронной почты. конкретной электронной почты

  3. Он получает 6-значный проверочный код

  4. Он вводит 6-значный код, который он получил

  5. Если код действителен (проверьте, существует ли код для данного email), он переходит к следующему шагу, в противном случае возникает ошибка

    .

Вам нужно отслеживать email и код, поэтому добавьте модель, которая будет содержать код с email. Позже проверьте с помощью запроса и на основе этого верните равные или не равные значения.

class CodeEmail(models.Model):
    code = models.IntegerField()
    email = models.EmailField(max_length=254)

class CodeSerializer(serializers.Serializer):
    code = serializers.IntegerField()
    email  = serializers.EmailField()

class CodeView(APIView): 

    def post(self, request, format=None):
        serializer = CodeSerializer(data=request.data)
        if serializer.is_valid():
            if CodeEmail.objects.filter(code = serializer.validated_data['code'] , email= serializer.validated_data['email']).exists()  :
                return Response({'message':'equal'})
            else:
                return Response({'message':'not equal'})
        else:
            print(serializer.errors)
            return Response({'message': 'Serializer is not valid'})
Вернуться на верх