美文网首页
自定义登录接口三种登录方式,并签发token,写在全局钩子中

自定义登录接口三种登录方式,并签发token,写在全局钩子中

作者: 晨颜 | 来源:发表于2023-05-30 19:54 被阅读0次
    # serializer.py
    from .models import User
    from rest_framework.exceptions import ValidationError
    from rest_framework_jwt.serializers import jwt_payload_handler, jwt_encode_handler
    import re
    from rest_framework import serializers
    from django.contrib.auth.hashers import check_password
    class UserSerialzier(serializers.ModelSerializer):
        username=serializers.CharField()
        class Meta:
            model=User
            # fields='__all__'
            fields = ['username', 'password']
        #方法一#使用该方法1.fields = ['username', 'password','email','phone'],2.'username', 'password','email','phone'都要传值,值可以为空
        def validate(self,attrs):
            print('attrs=',attrs)
            username=attrs.get('username')
            email=attrs.get('email')
            phone=attrs.get('phone')
            password=attrs.get('password')
            for obj in[User.objects.filter(username=username).first(), User.objects.filter(email=email).first(),User.objects.filter(phone=phone).first()]:
                if obj:break
            print(obj.phone, obj.email, obj.username)
            if obj and obj.check_password(password):
                payload = jwt_payload_handler(obj)
                token=jwt_encode_handler(payload)
                print(token)
                self.token = token
                self.user =obj
                return attrs
            raise ValidationError('用户名或密码错误')
        #方法二
        def validate(self,attrs):
            username=attrs.get('username')
            password=attrs.get('password')
            if re.match(r'^1[3-9][0-9]{9}$', username):userobj = User.objects.filter(phone=username).first()
            elif re.match(r'^.+@.+$', username): userobj = User.objects.filter(email=username).first()
            else:userobj= User.objects.filter(username=username).first()
            if userobj and userobj.check_password(password):
                #签发token
                payload=jwt_payload_handler(userobj)
                token=jwt_encode_handler(payload)
                self.user=userobj
                self.token=token
                return attrs
            raise ValidationError('用户名或密码错误')
    
    # views.py
    from django.shortcuts import render,HttpResponse
    from rest_framework.response import Response
    
    # Create your views here.
    from rest_framework.viewsets import ViewSet
    from .serialzier import UserSerialzier
    class Login(ViewSet):
        def login(self,request):
            print('request.data',request.data)
            serialzier=UserSerialzier(data=request.data)
            # print(serialzier.data)
            # print('>>>>>>>>>>>>>>>>>serialzier.data',serialzier.data)
            if serialzier.is_valid():
                print('serialzier.data',serialzier.data)
                return Response({'code': '100','msg':'ok','token':serialzier.token,'username':serialzier.user.username})
            return Response({'msg': serialzier.errors})
    

    相关文章

      网友评论

          本文标题:自定义登录接口三种登录方式,并签发token,写在全局钩子中

          本文链接:https://www.haomeiwen.com/subject/avseedtx.html