【问题标题】:How to check email verification code equality in django rest framework?如何在 django rest 框架中检查电子邮件验证码是否相等?
【发布时间】:2022-01-16 08:55:26
【问题描述】:

我正在尝试使用 django rest 框架为我的网站构建电子邮件验证。机制是这样的:

  1. 用户输入他的电子邮件并按继续按钮
  2. 他得到一个 6 位数的验证码
  3. 他输入了他收到的 6 位数代码
  4. 如果代码有效,他会进入下一步,否则会发生错误

我的问题在第4步。我不知道如何检查验证码是否相等,因为我无法从第2步得到它。

我的代码如下。如果有人能帮助我解决这个问题,我会很高兴:)

序列化器.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 中使用它进行相等性检查。

谢谢

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    这是您的代码中缺少的内容,

    1. 用户输入他的电子邮件并按下继续按钮

    2. 后端收到电子邮件并为此生成一个 6 位数的验证 特定的电子邮件

    3. 他得到一个 6 位数的验证码

    4. 他输入他收到的 6 位数代码

    5. 如果代码有效(检查该电子邮件的代码是否存在),他 进入下一步,否则出错

    您需要跟踪电子邮件和代码,因此添加一个包含电子邮件代码的模型。稍后通过查询进行验证,并根据返回是否相等。

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

    【讨论】:

      猜你喜欢
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 2018-01-22
      • 2018-04-15
      • 2019-09-04
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多