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

# 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})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容