简体   繁体   English

如何在django rest框架中检查email验证码是否相等?

[英]How to check email verification code equality in django rest framework?

I am trying to build a email verification for my website with django rest framework.我正在尝试使用 django rest 框架为我的网站构建 email 验证。 The mechanism is like this:机制是这样的:

  1. User enters his email and presses continue button用户输入他的 email 并按下继续按钮
  2. He gets a 6 digit verification code他得到一个6位数的验证码
  3. He enters the 6 digit code that he received他输入他收到的 6 位数代码
  4. If the code is valid he goes to next step and else an error occurs如果代码有效,他会进入下一步,否则会发生错误

My problem is in step 4. I don't know how to check the verification code equality, because I can't get it from step 2.我的问题在第4步。我不知道如何检查验证码是否相等,因为我无法从第2步得到它。

My codes are below.我的代码如下。 I'd be so happy if anyone can help me through this problem:)如果有人能帮助我解决这个问题,我会很高兴:)

serializers.py序列化程序.py

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

class EmailSerializer(serializers.ModelSerializer):

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

methods.py方法.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视图.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'})

I want to know how to get the generated code in EmailView and use it in CodeView for equality check.我想知道如何在 EmailView 中获取生成的代码并在 CodeView 中使用它进行相等性检查。

Thanks谢谢

Here is what is missing in your code,这是您的代码中缺少的内容,

  1. User enters his email and presses continue button用户输入他的 email 并按下继续按钮

  2. Backend gets the email and generates a 6 digit verification for that specific email后端获取 email 并为该特定 email 生成 6 位验证

  3. He gets a 6 digit verification code他得到一个6位数的验证码

  4. He enters the 6 digit code that he received他输入他收到的 6 位数代码

  5. If the code is valid (check if the code exist for that email ) he goes to next step and else an error occurs如果代码有效(检查 email 的代码是否存在),他将进入下一步,否则会发生错误

You need to keep track of email and code, so add a model that will contain code with email.您需要跟踪 email 和代码,因此添加一个 model 将包含 email 的代码。 Later verify with a query and based on that return equal or not equal.稍后使用查询进行验证,并根据返回是否相等。

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'})

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM