设为首页 加入收藏

TOP

登录注册接口搭建(一)
2023-07-25 21:23:01 】 浏览:47
Tags:

登录接口分析

登录分为多方式登录和验证码登录方式

多方式登录

1)前台提供账号密码,账号可能是 用户名、手机号、邮箱等

接口:
后台只需要提供一个多方式登录接口即可 - 多方式登录接口

多方式登录接口

前端输入完账号和密码,点击登录,向后端发送请求进行校验用户登录数据

urls.py

from django.urls import path,re_path,include
from rest_framework.routers import SimpleRouter
from user import views

router = SimpleRouter()
router.register('',views.LoginView,'login')

urlpatterns = [
    path('',include(router.urls)),
]

views.py

from rest_framework.viewsets import ViewSet
from user import serializers
from luffyapi.utils.response import APIResponse
from rest_framework.decorators import action
class LoginView(ViewSet):
    # 密码方式登录接口
    @action(methods=['POST'],detail=False) # 加入action装饰器,自动生成路由
    def login(self,request,*args,**kwargs):
        # 把前端传入的用户登录数据传入序列化器
        ser = serializers.UserModelserialize(data=request.data)
        # 判读传入的数据是否合法
        if ser.is_valid():
            # 合法获取token和用户名
            token =ser.context['token']
            username = ser.context['user'].username
            # 然后返回给前端
            return APIResponse(token=token,username=username)
        else:
            return APIResponse(code='0',msg=ser.errors)

serializes.py

from rest_framework import serializers
from user import models
from rest_framework.exceptions import ValidationError


class UserModelserialize(serializers.ModelSerializer):
    username = serializers.CharField() # ?
    class Meta:
        model = models.UserInfo
        fields = ['username','password','id']
        extra_kwargs = {
            'id':{'read_only':True},
            'password': {'write_only': True},
        }

    def validate(self, attrs):
        # 多种方式登录
        user = self._get_user(attrs)
        # 签发token
        token = self._get_token(user)
        # 放到context中,我在视图函数中可以取出来
        self.context['token'] = token
        self.context['user'] = user
        return attrs

    # 校验前端发来的数据
    def _get_user(self, attrs):
        # 获取前端发送的数据
        username = attrs.get('username')
        password = attrs.get('password')
        import re
        # 校验前端的用户是否为手机号、邮箱、用户名登录
        if re.match('^1[3-9][0-9]{9}$',username):
            user = models.UserInfo.objects.filter(telephone=username).first()
        elif re.match('^.+@.+$',username):
            user = models.UserInfo.objects.filter(email=username).first()
        else:
            user = models.UserInfo.objects.filter(username=username).first()
        # 用户名存在,则校验密码
        if user:
            ret = user.check_password(password)
            if ret:
                return user
            else:
                raise ValidationError('密码错误')
        else:
            raise ValidationError('用户名不存在')

    # 签发token函数,前面加一个_暗示内部使用的
    def _get_token(self,user):
        from rest_framework_jwt.serializers import jwt_payload_handler,jwt_encode_handler
        pyload = jwt_payload_handler(user) #通过user对象获取pyload
        token = jwt_encode_handler(pyload) #通过pyload获取token
        return token

验证码登录

验证码可以保存在redis里,也可以保存在缓存里

1)前台提供手机号和验证码完成登录

接口:
前台填完手机号,往后台发送校验手机号的请求,如果存在继续,不存在提示注册 - 手机号存在与否接口
前台点击发送验证码,将手机再次发送给后台,后台将手机号通知给第三方,发送短信 - 手机验证码接口
前台点击登录提交手机号与验证码,完成验证码登录 - 验证码登录接口

手机号是否存在的接口设计

    # 校验手机号是否存在接口
    @action(methods=['GET'], detail=False)
    def check_telephone(self, request, *args, **kwargs):
        telephone = request.GET.get('telephone')
        if not re.match('^1[3-9][0-9]{9}$',telephone):
            return APIResponse(code=0,msg='手机号不合法')
        try:
            models.UserInfo.objects.get(telephone=telephone)
            return APIResponse()
        except:
            return APIResponse(code=0,msg='手机号不存在')

发送验证码接口

from luffyapi.libs.tx_msg import get_code,send_message # 导入封装好的短信接口
from django.core.cache import cache # 导入缓存
from django.conf import settings
    # 发送验证码接口
    @action(metho
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇ajax的请求,异步,同源策略的学习 下一篇pyinstaller和venv的关系

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目