# 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})
网友评论