首页 > 其他分享 >登录注册分析、多方式登录接口

登录注册分析、多方式登录接口

时间:2023-06-28 21:55:33浏览次数:35  
标签:username 手机号 登录 get mobile 接口 --- user 注册

目录

一、登录注册页面分析

# 根据原型图分析出:要写的功能
    # 用户名密码登录接口
    # 注册功能接口
    # 手机号验证码登录接口
    # 发送短信验证码接口
    # 验证手机号是否存在接口

二、路由

总路由

path('api/v1/user/', include('user.urls')),

分路由:user/urls.py

from django.urls import path
from . import views
from rest_framework.routers import SimpleRouter

router = SimpleRouter()
router.register('userinfo', views.UserView, 'userinfo')

urlpatterns = [

]
urlpatterns += router.urls

三、验证手机号是否存在接口

3.1 不同方式验证手机号

from rest_framework.viewsets import ViewSet
from rest_framework.decorators import action
from .models import User

"""方式一"""
class UserView(ViewSet):
    # 验证手机号是否存在的接口 ---> get请求 ---> 要操作数据库,但不需要序列化 --> 想要自动生成路由
    # ---> 继承ViewSet
    @action(methods=['GET'], detail=False)
    def check_mobile(self, request, *args, **kwargs):
        # get请求,手机号会拼在路径上
        # 取出前端传入的手机号
        mobile = request.query_patams.get('mobile', None)
        if mobile:
            user = User.objects.filter(mobile=mobile).first()
            if user:
                return APIResponse(msg='手机号存在')
            else:
                return APIResponse(code=101, msg='手机号不存在')
        else:
            return APIResponse(code=101, msg='手机号没传')

        
        
"""方式二:"""
from rest_framework.exceptions import APIException

class UserView(ViewSet):
    # 验证手机号是否存在的接口 ---> get请求 ---> 要操作数据库,但不需要序列化 --> 想要自动生成路由
    # ---> 继承ViewSet
    @action(methods=['GET'], detail=False)
    def check_mobile(self, request, *args, **kwargs):
        # get请求,手机号会拼在路径上
        # 取出前端传入的手机号
        mobile = request.query_params.get('mobile', None)
        if mobile:
            user = User.objects.filter(mobile=mobile).first()
            if user:
                return APIResponse(msg='手机号存在')
        # 前端只要接收到显示状态码不是100,就是手机号没有注册或者手机号错误或者没输手机号
        # 对错误,都可以抛异常
        raise APIException('手机号不存在')
        # return APIResponse('手机号不存在')
        
"""方式三:"""
class UserView(ViewSet):
    # 验证手机号是否存在的接口 ---> get请求 ---> 要操作数据库,但不需要序列化 --> 想要自动生成路由
    # ---> 继承ViewSet
    @action(methods=['GET'], detail=False)
    def check_mobile(self, request, *args, **kwargs):
        # get请求,手机号会拼在路径上
        # 取出前端传入的手机号
        mobile = request.query_params.get('mobile', None)
        if mobile:
            user = User.objects.filter(mobile=mobile).first()
            if user:
                return APIResponse(msg='手机号存在')
        # 只有手机号存在,并且手机号正确,才会返回数据,手机号不正确就会直接抛异常,就会被全局异常捕获住,后面的情况也就不需要写代码了
        

3.2 固定写法:

from rest_framework.viewsets import ViewSet
from rest_framework.decorators import action
from .models import User
from rest_framework.exceptions import APIException
class UserView(ViewSet):
    # 验证手机号是否存在的接口 ---> get请求 ---> 要操作数据库,但不需要序列化 --> 想要自动生成路由
    # ---> 继承ViewSet
    @action(methods=['GET'], detail=False)
    def check_mobile(self, request, *args, **kwargs):
        # get请求,手机号会拼在路径上
        # 取出前端传入的手机号
        try:
            # 可以把主要代码写在try中,产生的错误可以主动抛出
            mobile = request.query_params.get('mobile')
            print(mobile)
            User.objects.get(mobile=mobile)  # 使用get,有且只有一条才不报错,如果没有或多余一条,就报错
            return APIResponse(msg='手机号存在')
        except Exception as e:
            raise APIException('手机号不存在')

四、后端多方式登录接口

user/views.py

@action(methods=['POST'], detail=False)
    # 多方式登录接口---> 要不要序列化类---> 要用序列化类---> 继承的视图类基类
    # post请求--->前端携带的数据 {username:xxx,password:123}
    def mul_login(self, request, *args, **kwargs):
        # 校验逻辑写在序列化类中
        ser = self.get_serializer(data=request.data)
        # 只要执行它,就会执行 字段自己的校验规则,局部钩子,全局钩子(全局钩子中写验证逻辑,生成token的逻辑)
        ser.is_valid(raise_exception=True)  # 如果校验失败,会主动抛出异常
        username = ser.context.get('username')
        icon = ser.context.get('icon')
        token = ser.context.get('token')
        return APIResponse(username=username, token=token, icon=icon)

user/serializers.py

from .models import User
from rest_framework import serializers
from rest_framework_jwt.settings import api_settings
from django.db.models import Q
from rest_framework.exceptions import APIException, ValidationError
from django.conf import settings

jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER


class LoginUserSerializer(serializers.ModelSerializer):
    # 字段自己的规则,会走唯一性校验--->就过不了---->必须要重写该字段
    username = serializers.CharField(required=True)

    class Meta:
        model = User
        fields = ['username', 'password']  # 只做数据校验--->写校验的字段

    def _get_user(self, attrs):
        username = attrs.get('username')
        password = attrs.get('password')
        # user=User.objects.filter(username=username || mobile=username || email=username)
        user = User.objects.filter(Q(username=username) | Q(mobile=username) | Q(email=username)).first()
        if user and user.check_password(password):
            # 说明用户名存在,密码再校验
            return user
        else:
            raise APIException('用户名或密码错误')

    def _get_token(self, user):
        # jwt的签发
        payload = jwt_payload_handler(user)
        token = jwt_encode_handler(payload)
        return token

    def validate(self, attrs):
        # 验证用户名密码逻辑---->签发token逻辑
        # username字段可能是 用户  ,手机号,邮箱--->正则匹配--->换一种方式 使用Q查询
        user = self._get_user(attrs)
        # 签发token
        token = self._get_token(user)
        # 把用户,token放在 序列化类的context中【上下文】
        self.username = user.username
        self.context['username'] = user.username
        self.context[ 'icon'] = settings.BACKEND_URL + user.icon.url
        self.context['token'] = token

        return attrs

标签:username,手机号,登录,get,mobile,接口,---,user,注册
From: https://www.cnblogs.com/zjyao/p/17512671.html

相关文章

  • 案例-用户注册
      packagecom.itheima.web;importcom.itheima.mapper.UserMapper;importcom.itheima.pojo.User;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.i......
  • 案例-用户登录-代码实现
       代码实现packagecom.itheima.mapper;importcom.itheima.pojo.User;importorg.apache.ibatis.annotations.Param;importorg.apache.ibatis.annotations.Select;publicinterfaceUserMapper{@Select("select*fromtb_userwhereusername=#{use......
  • 案例-用户登录-准备环境
     准备登录界面<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>login</title><linkhref="css/login.css"rel="stylesheet"></head><bod......
  • api接口接入淘宝/天猫平台采集添加到购物车数据调用演示案例
    ​淘宝添加到购物车API接口的作用是向淘宝购物车中添加指定的商品,实现用户将商品加入购物车的功能。通过该API接口,用户可以将商品加入购物车,方便后续进行结算和购买。使用淘宝添加到购物车API接口,可以帮助开发者和商家进行以下操作:购物车管理:允许用户将商品添加到购物车并进行......
  • 苹果开发者账号注册设备异常是怎么回事
    对于近期新续费的,或者新注册的苹果开发者账号,有一些开发人员发现,当在开发者账号里添加了一定数目的设备后,会出现如下的提示信息: Registrationisbeingprocessedforthesedevices.Theymaybecomeavailablefordevelopmentandadhocdistributionin24to72hours.......
  • 在EasyCVR中调用快照接口返回404是什么原因?如何解决?
    EasyCVR视频融合平台基于云边端一体化架构,能在复杂的网络环境中将前端设备进行统一集中接入,实现视频资源的汇聚管理、直播鉴权、转码处理、多端分发、智能告警、数据共享等能力与服务。此外,平台也提供了丰富的API接口供用户自由调用、集成与二次开发。有用户反馈,在EasyCVR中调用......
  • 前端打包部署后接口BASE_URL不对问题解决办法
    在前端打包部署时,为了免去不同环境打包的麻烦,项目用的流水线触发方式。在这里不细说,重点说说下面情况。当项目提交打包部署后,访问压测环境或者生产环境的地址来使用项目时,发现接口报错404。 在NETWORK里发现接口的BASEURL和当前环境需要调用的后端baseurl不同。主要问题在于......
  • 免费体验Stable Diffusion deforum文转视频插件,还有deforum API 接口部署介绍!
    如何使用ServerlessDevs和函数计算快速体验部署StableDiffusion,这个是小白也能简单体验安装部署的教程.有电脑就能操作,依托阿里云原生服务.不用考虑硬件问题本篇主要讲解怎么安装跟部署自定义安装插件跟模型.以deforum文转视频插件举例.deforumapi接口自定义开发镜像定......
  • api接口接入淘宝/天猫平台获取商品销量详情调用演示案例
    ​淘宝商品销量详情接口的作用是获取淘宝平台上某一商品的销售情况信息,包括商品的总销量、近期销量、销售趋势等。通过该接口,可以获取到商品销量的原始数据,用于分析商品的受欢迎程度和市场需求。使用淘宝商品销量详情接口,可以帮助商家和开发者进行以下操作:市场分析:通过获取商......
  • API接口的分类大全
    API接口可以按照不同的标准和功能进行分类,主要包括以下几种:根据功能分类:数据接口:用于获取、修改和删除数据的接口,包括增删查改等操作。认证接口:用于验证用户身份和权限的接口,通常用于用户登录、授权等操作。通知接口:用于发送通知和消息的接口,例如短信接口、邮件接口等。支付接口:用......