Как проверить равенство кода проверки электронной почты в django rest framework?
Я пытаюсь создать проверку электронной почты для моего сайта с помощью django rest framework. Механизм выглядит следующим образом:
- User enters his email and presses continue button
- He gets a 6 digit verification code
- He enters the 6 digit code that he received
- 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 для проверки равенства.
Спасибо
Вот что отсутствует в вашем коде,
Пользователь вводит свой e-mail и нажимает кнопку продолжить
Бэкэнд получает электронную почту и генерирует 6-значную верификацию для этой электронной почты. конкретной электронной почты
Он получает 6-значный проверочный код
Он вводит 6-значный код, который он получил
Если код действителен (проверьте, существует ли код для данного 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'})