基于jwt的多方式登陆
1 手机号+密码 用户名+密码 邮箱+密码2 流程分析(post请求): -路由:自动生成(推荐自动生成,自己手写也行) -视图类:ViewSet(ViewSetMixin, views.APIView) -序列化类:重写validate方法,在这里面对用户名和密码进行校验
代码实现
models.py----->进行数据迁移
from django.db import modelsfrom django.contrib.auth.models import AbstractUserclass UserInfo(AbstractUser): phone = models.CharField(max_length=32, unique=True)class MyUser(models.Model): username = models.CharField(max_length=32) password = models.CharField(max_length=32) phone = models.CharField(max_length=32) email = models.EmailField()
settings.py
INSTALLED_APPS = [ ... 'rest_framework']#扩写AUTH_USER表AUTH_USER_MODEL = 'app01.UserInfo'
views.py
from rest_framework.viewsets import ViewSetfrom app01.serializer import LoginSerializerfrom app01.utils import APIResponseclass LoginViewSet(ViewSet): def create(self, request, *args, **kwargs): # 实例化得到一个序列化类的对象 # ser=LoginSerializer(data=request.data,context={'request':request}) ser = LoginSerializer(data=request.data) # 序列化类的对象的校验方法 ser.is_valid(raise_exception=True) # 字段自己的校验,局部钩子校验,全局钩子校验 # 如果通过,表示登录成功,返回手动签发的token token = ser.context.get('token') username = ser.context.get('username') return APIResponse(token=token, username=username) # 如果失败,不用管了serializer.py
from rest_framework import serializersfrom app01.models import UserInfoimport refrom rest_framework.exceptions import ValidationErrorfrom rest_framework_jwt.utils import jwt_encode_handler, jwt_payload_handlerclass LoginSerializer(serializers.ModelSerializer): #重写username不然报错 username = serializers.CharField() class Meta: model = UserInfo fields = ['username', 'password'] def validate(self, attrs): # username可能是邮箱,手机号,用户名 username = attrs.get('username') password = attrs.get('password') # 如果是手机号 if re.match('^1[3-9]\d{9}$', username): # 以手机号登录 user = UserInfo.objects.filter(phone=username).first() elif re.match('^.+@.+$', username): # 以邮箱登录 user = UserInfo.objects.filter(email=username).first() else: # 以用户名登录 user = UserInfo.objects.filter(username=username).first() # 如果user有值并且密码正确 if user and user.check_password(password): # 登录成功,生成token # drf-jwt中有通过user对象生成token的方法 payload = jwt_payload_handler(user) token = jwt_encode_handler(payload) # token是要在视图类中使用,现在我们在序列化类中 # self.context.get('request') # 视图类和序列化类之间通过context这个字典来传递数据 self.context['token'] = token self.context['username'] = user.username #一定要记得return return attrs else: raise ValidationError('用户名或密码错误')utils.py
from rest_framework.response import Responseclass APIResponse(Response): def __init__(self, code=100, msg='成功', data=None, status=None, headers=None, content_type=None, **kwargs): dic = {'code': code, 'msg': msg} if data: dic['data'] = data dic.update(kwargs) super().__init__(data=dic, status=status, headers=headers, content_type=content_type)urls.py
from django.urls import pathfrom rest_framework.routers import SimpleRouterfrom app01 import viewsrouter = SimpleRouter()#必须要加,basename='login',不然会报错router.register('login', views.LoginViewSet,basename='login')print(router.urls)urlpatterns = [ ...]urlpatterns += router.urls登录方式: />
原文转载:http://www.shaoqun.com/a/492736.html
飞书互动:https://www.ikjzd.com/w/1319
联动优势:https://www.ikjzd.com/w/1921
1号团:https://www.ikjzd.com/w/2263
基于jwt的多方式登陆1手机号+密码用户名+密码邮箱+密码2流程分析(post请求):-路由:自动生成(推荐自动生成,自己手写也行)-视图类:ViewSet(ViewSetMixin,views.APIView)-序列化类:重写validate方法,在这里面对用户名和密码进行校验代码实现models.py----->进行数据迁移fromdjango.dbimportmodelsfromdja
sgshop:sgshop
万国邮政联盟:万国邮政联盟
好消息!空运价格大幅回落,Wish部分物流渠道价格更新:好消息!空运价格大幅回落,Wish部分物流渠道价格更新
从上步南天桥到南澳西冲怎么走?坐什么车:从上步南天桥到南澳西冲怎么走?坐什么车
2020年端午假北京天气怎么样?哪里好玩?:2020年端午假北京天气怎么样?哪里好玩?
没有评论:
发表评论
注意:只有此博客的成员才能发布评论。