【问题标题】:I want to send and an otp with REST Framework我想用 REST Framework 发送一个 otp
【发布时间】:2023-02-26 05:47:20
【问题描述】:

文件“/home/ali/MAKEEN/makeen-tasks/ali/tasks/user/api/services.py”,第 24 行,在 generate_otp self.otp = str(randint(100000, 999999)) AttributeError: 'str' 对象没有属性 'otp'

    self._otp = str(randint(100000, 999999))
AttributeError: 'str' object has no attribute '_otp'
[25/Feb/2023 14:04:01] "POST /login1/ HTTP/1.1" 500 101590

服务.py

class OTPGenerator:
    def __init__(self, phone_number):
        self.phone_number = phone_number
        self._otp = None


    def generate_otp(self):
        self._otp = str(randint(100000, 999999))
        redis_conf.set(name=self.phone_number, value=self._otp, ex=30)
        otp_code = redis_conf.get('phone_number')
        return otp_code

    def __str__(self):
        return self.otp

    def send(self):
        send_sms(phone_number=self.phone_number, otp=self.otp)


    def value(self):
        return redis_conf.get(self.phone_number)

    def is_valid(self, otp):
        if redis_conf.get(self.phone_number) == otp:
            redis_conf.delete(self.phone_number)
            return True
        return False

视图.py



class User(APIView):
    seri_data_phone = serializers.GenerateOTPSerializer

    def post(self, request, *args, **kwargs):
        # serializer = serializers.GenerateOTPSerializer(data=request.data)
        serializer = self.seri_data_phone(data=request.data)
        if serializer.is_valid():
            phone_number = serializer.validated_data.get('phone_number')
            if phone_number:
                otp = services.OTPGenerator.generate_otp(phone_number)
                return Response({'message': f"your otp is {otp}"}, status=status.HTTP_200_OK)
            else:
                return Response({'error': 'phone number not found'}, status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

序列化程序.py

class GenerateOTPSerializer(serializers.Serializer):
    phone_number = serializers.CharField(max_length=11, required=True)


    def phone_validation(self, phone_number):

        if phone_number[0] == '0' and phone_number[1] == '9' and len(phone_number) == 11 and \
                str(phone_number).isnumeric() == True:
            return phone_number
        else:
            return ValueError('your phone-number contain 11 digits and starts with ZERO and 9')

我的错误在哪里?

【问题讨论】:

  • 请编辑问题并正确格式化您的代码。
  • 我的错误在哪里?您想发送所有模块吗?
  • 所提供的代码乍一看是正确的。错误在别处
  • 这是整个代码。你能帮助我吗?

标签: python django django-rest-framework


【解决方案1】:
def __str__(self):
    return self.otp

应该

def __str__(self):
    return self._otp

【讨论】:

    【解决方案2】:

    您没有在 OTPGenerator 实例上调用 generate_otp 方法。您没有正确初始化您的 OTPGenerator 类。

    你这样打电话:

    otp = services.OTPGenerator.generate_otp(phone_number)
    

    您还没有初始化 OTPGenerator 类。所以,当你直接在类上调用方法时,你实际上是在self参数中传递了phone_number,这导致了AttributeError: 'str' object has no attribute 'otp'的错误

    你需要做的是做这样的事情:

    otp = services.OTPGenerator(phone_number=phone_number).generate_otp()
    

    这意味着您首先要创建该类的一个对象,然后对该对象调用方法generate_otp。这将确保将两个参数传递给 __init__ 方法,第一个是 self,这是您的 OTPGenerator 类的对象,第二个是 phone_number。最后,您可以调用 generate_otp 方法来实际生成您的 OTP。

    最后,一个技巧是使用像django-phone-verify这样的包;开发回购:https://github.com/CuriousLearner/django-phone-verify。这可以帮助您通过 OTP 和可重复使用的安全代码验证电话号码。

    笔记:完全披露:我是 Django-Phone-Verify 的创建者和维护者

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2021-12-15
      • 2020-10-14
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多