# 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,写在全局钩子中
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 之前的登录界面和登录接口都是使用的Spring Security提供的,导致用户可能不清楚里面具体的登录原理,而且...
- mybatis-generator是一个很好的数据库逆向生成Java实体的插件,但不能添加中文注释和注解,如果我们...
- 基本步骤: 一、自定义用户表: 1、自定义的用户表继承AbstractUser;2、settings.py添加配置...
- 导入依赖 springboot配置类 在springboot项目中配置shiro,包括密码加盐处理、记住密码、自动...
- 01-网络编程(TCP-上传图片) 我们看看客户端和服务端都需要做哪些事情~ 客户端: 1...