基于jwt的登录/注册功能实现

# views.py
# 登录视图
class LoginView(ViewSet):
    # 登录
    @action(methods=['POST'], detail=False)
    def login(self, request, *args, **kwargs):
        ser_obj = ser.UserModelSerializer(data=request.data)
        if ser_obj.is_valid():
            token = ser_obj.context['token']
            username = ser_obj.context['user'].username
            user = ser_obj.context['user']
            return response.ApiResponse(token=token, username=username, is_superuser=user.is_superuser)
        else:
            return response.ApiResponse(code=0, msg=ser_obj.errors)

	    # 手机号验证
    @action(methods=['GET'], detail=False)
    def check_telephone(self, request):
        telephone = request.query_params.get('telephone')
        if re.match('^1[3-9][0-9]{9}$', telephone):
            user = models.UserInfo.objects.filter(telephone=telephone).first()
            if user:
                return response.ApiResponse(result=True)
            else:
                return response.ApiResponse(result=False)
        else:
            return response.ApiResponse(code=0, msg='手机号不合法')
# 发送验证码视图
class SmsView(ViewSet):
    # 如果项目要上线,最好加上下边的频率限制类,该类没有写^_^
    # throttle_classes = [throttlings.SmsThrotting]
    # 发送验证码
    @action(methods=['GET'], detail=False)
    def send_sms(self, request):
        telephone = request.query_params.get('telephone')
        if re.match('^1[3-9][0-9]{9}$', telephone):
            user = models.UserInfo.objects.filter(telephone=telephone).first()
            # print(user.username)
            if user:
                print('用户存在')
                code = send_sms.get_code()
                if send_sms.send(code, telephone):
                    cache.set('code', code, 60)
                    print(cache.get('code'))
                    return response.ApiResponse(code=100, msg='发送验证码成功')
                else:

                    return response.ApiResponse(msg='未知错误')
            else:
                print('用户不存在')
                return response.ApiResponse(code=2, msg='手机号不存在')
        else:
            return response.ApiResponse(msg='号码不符合规范,傻der')

    # 验证码登录
    @action(methods=['POST'], detail=False)
    def sms_login(self, request):
        telephone = request.data['telephone']
        code = request.data['code']
        if str(code) == str(cache.get('code')):
            user = models.UserInfo.objects.filter(telephone=telephone).first()
            if user:
                # 获取签发
                payload = jwt_payload_handler(user)
                # 签发encode成token
                token = jwt_encode_handler(payload)
                return response.ApiResponse(token=token, username=user.username, is_superuser=user.is_superuser)
            else:
                return response.ApiResponse(code=0, msg='用户不存在')
        else:
            return response.ApiResponse(code=2, msg='验证码过期或者不正确')
# ser.py
class UserModelSerializer(ModelSerializer):
    username = serializers.CharField(max_length=32)

    class Meta:
        model = models.UserInfo
        fields = ['username', 'password', 'id']
        extra_kwargs = {
            'id': {'read_only': True},
            'password': {'write_only': True}
        }

    def validate(self, attrs):
        # 验证用户
        user = self._get_user(attrs)
        # 签发token
        token = self._get_token(user)
        # 将验证后的数据保存下来,给视图使用
        self.context['token'] = token
        self.context['user'] = user
        return attrs

    def _get_user(self, attrs):
        username = attrs.get('username')
        password = attrs.get('password')
        import re
        # 后台验证账号类型
        if re.match('^1[3-9][0-9]{9}$', username):
            user = models.UserInfo.objects.filter(telephone=username).first()
        elif re.match('^.*@.*$', username):
            user = models.UserInfo.objects.filter(email=username).first()
        else:
            user = models.UserInfo.objects.filter(username=username).first()
        if user:
            ret = user.check_password(password)
            if ret:
                user.last_login = datetime.datetime.now()
                user.save()
                return user
            else:
                raise ValidationError('密码错误')
        else:
            raise ValidationError('用户不存在')

    def _get_token(self, user):
        # 获取签发
        payload = jwt_payload_handler(user)
        # 签发encode成token
        token = jwt_encode_handler(payload)
        return token


class RegisterSerializer(serializers.ModelSerializer):
    code = serializers.CharField(max_length=4)

    class Meta:
        model = models.UserInfo
        fields = ['telephone', 'code', 'password']
        extra_kwargs = {
            'password': {'write_only': True, 'max_length': 11, 'min_length': 3}
        }

    def validate(self, attrs):
        code = attrs.get('code')
        telephone = attrs.get('telephone')
        password = attrs.get('password')
        import re
        if re.match('^1[3-9][0-9]{9}$', telephone):
            user = models.UserInfo.objects.filter(telephone=telephone).first()
            if user:
                raise ValidationError('用户已经存在')
            if code == cache.get('code'):
                return attrs
            else:
                raise ValidationError('验证码不正确')
        else:
            return ValidationError('手机号不合法')
        return attrs


class RegisterView(ViewSet):
    # 注册
    @action(methods=['POST'], detail=False)
    def register(self, request):
        ser_obj = ser.RegisterSerializer(data=request.data)
        telephone = request.data['telephone']
        password = request.data['password']
        if ser_obj.is_valid():
            user = models.UserInfo.objects.create_user(username=telephone, telephone=telephone, password=password)
            token = self._get_token(user)
            return response.ApiResponse(msg='注册成功', token=token, username=user.username)
        else:
            return response.ApiResponse(code=0, msg='用户已经存在或者手机号不合法或者验证码不正确')
	# 注册通过验证码注册
    @action(methods=['GET'], detail=False)
    def register_send_sms(self, request):
        telephone = request.query_params.get('telephone')
        if re.match('^1[3-9][0-9]{9}$', telephone):
            user = models.UserInfo.objects.filter(telephone=telephone).first()
            code = send_sms.get_code()
            if send_sms.send(code, telephone):
                # if 1:
                cache.set('code', code, 60)
                print(cache.get('code'))
                return response.ApiResponse(code=100, msg='发送验证码成功')
            else:
                return response.ApiResponse(msg='未知错误')
        else:
            return response.ApiResponse(msg='号码不符合规范,傻der')

    def _get_token(self, user):
        # 获取签发
        payload = jwt_payload_handler(user)
        # 签发encode成token
        token = jwt_encode_handler(payload)
        return token
# urls.py
from rest_framework.routers import SimpleRouter
router = SimpleRouter()

# 注册用户的登录,验证码,注册路由
router.register('',views.LoginView,'login')
router.register('',views.SmsView,'send')
router.register('',views.RegisterView,'register')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦琦不是MQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值