# 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...