【问题标题】:'str' object has no attribute 'verified'“str”对象没有“已验证”属性
【发布时间】:2023-04-08 20:25:02
【问题描述】:

我在我的 twilio 项目中加入了 OTP。但是在验证电话号码时会引发以下错误。

phone.verified = True
AttributeError: 'str' object has no attribute 'verified'

models.py

class User(AbstractBaseUser, PermissionsMixin):
    phone = models.CharField(max_length=15, unique=True)
    is_active = models.BooleanField(default = True)

    is_staff = models.BooleanField(default = False)

    USERNAME_FIELD = 'phone'

    key = models.CharField(max_length=100, unique=True, blank=True)
    verified = models.BooleanField(default=False)
    objects = UserManager()

views.py

@api_view(['GET'])
def send_sms_code(request, format=None):
    time_otp = pyotp.TOTP(request.user.key, interval=10000)
    time_otp = time_otp.now()
    user_phone_number = request.user.phone
    client.messages.create(
                    body="Your verification code is "+time_otp,
                    from_=twilio_phone,
                    to=user_phone_number
                )
    return Response(status=200)


@api_view(['GET'])
def verify_phone(request, sms_code, format=None):
    code = int(sms_code)
    if request.user.authenticate(code):
        phone = request.user.phone
        phone.verified = True
        phone.save()
        return Response(dict(detail = "Phone number verified successfully"),status=201)
    return Response(dict(detail='The provided code did not match or has expired'),status=200)

它会向我发送一个验证码,但是当我要验证它时它无法正常工作。我知道问题出在哪里,但我该如何解决?任何帮助,将不胜感激!先谢谢了!

【问题讨论】:

  • 是否在用户模型或单独的手机模型上验证?如果是后者,User 模型上的 phone 应该是 Phone 模型的 ForeignKeyField 而不是 CharField,并且您的代码应该可以工作。如果验证在 User 模型上,请参阅下面提供的答案。

标签: django python-3.x django-models django-rest-framework


【解决方案1】:

您的 api 视图设置 phone = request.user.phone 这是一个字符串。然后,通过访问其上的已验证属性,您可以将 phone 当作 User 对象使用。相反,您的观点应该是:

@api_view(['GET'])
def verify_phone(request, sms_code, format=None):
  ...
  if request.user.authenticate(code):
    user = request.user # set user as a User object.
    user.verified = True
    user.save()
    return Response(...)
  return Response(...)

看起来您甚至没有使用 phone 变量,因此您提供给我们的信息并不真正需要它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2016-09-20
    • 2019-03-25
    • 2017-05-13
    • 2014-04-28
    • 2015-05-15
    • 2019-06-20
    相关资源
    最近更新 更多