ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

短信验证码接口,短信注册接口

2022-07-17 15:02:09  阅读:163  来源: 互联网

标签:code 短信 get mobile self 验证码 接口 token user


5 短信登录接口

# 前端传入的格式---{mobile:12334455,code:8888}

路由

router.register('sms', SMSView, 'sms')

视图类

class LoginView(GenericViewSet):
    queryset = User.objects.all()
    serializer_class = MulLoginSerializer

    def common_login(self, request):
        ser = self.get_serializer(data=request.data, context={'request': request})
        ser.is_valid(raise_exception=True)
        token = ser.context.get('token')
        icon = ser.context.get('icon')
        return APIResponse(token=token, icon=icon)
    # 重写这个方法get_serializer_class,返回什么序列化类,当前用的序列化类就是哪个
    def get_serializer_class(self):
        # 方式一 :通过请求路径来判断,可以
        # if 'mul_login' in self.request.path:
        #     return self.serializer_class
        # else:
        #     return 序列化类

        # 方式二:通过action判断
        if self.action =='sms_login':
            return SMSLoginSerializer
        else:
            return self.serializer_class

    @action(methods=['POST'], detail=False)
    def mul_login(self, request):
        return self.common_login(request)

    @action(methods=['POST'], detail=False)
    def sms_login(self, request):
        return self.common_login(request)

序列化类

class SMSLoginSerializer(serializers.ModelSerializer):
    code = serializers.CharField()  # code不是User表的字段,所以要重写code

    class Meta:
        model = User
        fields = ['mobile', 'code']

    def _check_user(self, attrs):
        mobile = attrs.get('mobile')
        code = attrs.get('code')
        # 校验code对不对?从缓存中取出来
        old_code = cache.get('sms_cache_%s' % mobile)
        # 取出来,立马失效
        cache.set('sms_cache_%s' % mobile,'')
        if old_code == code:  # 万能验证码
            user = User.objects.filter(mobile=mobile).first()
            if user:
                return user
            else:
                raise APIException(detail='用户不存在')
        else:
            raise APIException(detail='验证码错误')

    def _get_token(self, user):
        payload = jwt_payload_handler(user)
        token = jwt_encode_handler(payload)
        return token

    def validate(self, attrs):  # 在全局钩子中,校验用户是否登录成功,如果登录成功直接签发token
        # 1 手机号得到user
        user = self._check_user(attrs)
        # 2 user签发token---》签发token
        token = self._get_token(user)
        # 3 把token放到 self 对象中得context属性中
        self.context['token'] = token
        host = self.context.get('request').META['HTTP_HOST']
        self.context['icon'] = 'http://%s/media/%s' % (host, str(user.icon))

        return attrs

6 短信注册接口

# 前端传入数据----》{mobile:1983334,password:123,code:8888}

视图类

class UserView(GenericViewSet, CreateModelMixin):
    serializer_class = UserSerializer
    queryset = User.objects.all()

    def create(self, request, *args, **kwargs):
        super().create(request, *args, **kwargs)
        return APIResponse(msg='注册成功')

序列化类

class UserSerializer(serializers.ModelSerializer):
    code = serializers.CharField(write_only=True)  # code不是User表的字段,所以要重写code

    class Meta:
        model = User
        fields = ['mobile', 'password', 'code']
        extra_kwargs = {'password': {'write_only': True}}

    def validate(self, attrs):
        # 1 校验code是否正确
        mobile = attrs.get('mobile')
        code = attrs.get('code')
        old_code = cache.get('sms_cache_%s' % mobile)
        if not code == old_code:
            raise APIException(detail='验证码错误')

        # 2 手机号是否被注册过
        if User.objects.filter(mobile=mobile).first():
            raise APIException(detail='该手机号已经被注册')

        # 3 入库前准备---》code字段从attrs中剔除,username必填,手机号就是用户名
        attrs.pop('code')
        attrs['username'] = mobile

        return attrs

    def create(self, validated_data):
        # 因为新增用户,是用create_user新增的,不是使用create新增的
        user = User.objects.create_user(**validated_data)
        return user

路由

router.register('register', UserView, 'register')

标签:code,短信,get,mobile,self,验证码,接口,token,user
来源: https://www.cnblogs.com/zhengkaijian/p/16486856.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有