drf多方式登录接口(手机号、邮箱、验证码)登录

这篇具有很好参考价值的文章主要介绍了drf多方式登录接口(手机号、邮箱、验证码)登录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目

##### 3 多方式登录接口####
	-使用auth的user表扩写
	-用户名+密码
    -手机号+密码
    -邮箱+密码 
    
    -签发token逻辑,放在序列化类中写

方式一:

serializer.py

from rest_framework import serializers
from .models import UserInfo
from rest_framework.exceptions import ValidationError
import re

from rest_framework_jwt.settings import api_settings
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

class UserSerializer(serializers.ModelSerializer):
    username = serializers.CharField()  # 这个优先用这个,就不是映射过来的,就没有unique的限制了
    class Meta:
        model = UserInfo
        # 大坑:继承ModelSerializer后,fields的字段是映射过来的
        # username 是unique唯一的,反序列化校验的时候,字段自己的规则,会去数据库查询有没有这个用户,如果有,直接报错了
        fields = ['username','password']  # 只做反序列化的校验

    # 这个东西的返回值必须是个字典,校验过后的数据
    def validate(self,attrs):  # attr是前端传入的,校验过后的数据,先校验字段自己的然后局部钩子最后全局钩子
        # 1.获取前端传入的数据
        username = attrs.get('username')
        password = attrs.get('password')
        # 2.查用户是否存在(先查出用户再校验密码,查用户有三种类型:手机号,邮箱,用户名)
        if re.match(r'^1[3-9][0-9]{9}$', username):
            user = UserInfo.objects.filter(phone=username).first()
        elif re.match(r'^.+@.+$', username):
            user = UserInfo.objects.filter(email=username).first()
        else:
            user = UserInfo.objects.filter(username=username).first()
        if user and user.check_password(password):  # 再校验密码
            # 3.签发token
            payload = jwt_payload_handler(user)
            token = jwt_encode_handler(payload)
            self.user = user
            self.token = token
            return attrs
        else:
            raise ValidationError('用户名或密码错误')

views.py

from rest_framework.viewsets import ViewSet
from .serializer import UserSerializer
from rest_framework.response import Response

class UserView(ViewSet):
    def login(self,request):
        # 1 得到一个序列化类
        ser = UserSerializer(data=request.data)
        if ser.is_valid():  # 执行全局钩子
            user = ser.user
            token = ser.token
            return Response({'code': 100, 'msg': '登录成功', 'token': token, 'username': user.username})
        else:
            return Response({'code': 100, 'msg': ser.errors})

urls.py

path('login/',views.UserView.as_view({'post':'login'}))

方式二:

serializer.py

from rest_framework_jwt.settings import api_settings
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
from rest_framework import serializers
from django.contrib.auth import authenticate

class UserSerializer(serializers.Serializer):
    username = serializers.CharField()
    password = serializers.CharField()

    def validate(self, attrs):
        credentials = {
            'username':attrs.get('username'),
            'password': attrs.get('password')
        }

        if all(credentials.values()):
            user = authenticate(**credentials)
            if user:
                if not user.is_active:
                    msg = '滚蛋'
                    raise serializers.ValidationError(msg)

                payload = jwt_payload_handler(user)
                token = jwt_encode_handler(payload)
                self.token = token
                return {
                    'token':token,
                    'user': user
                }
            else:
                msg = '用户名密码错误'
                raise serializers.ValidationError(msg)
        else:
            msg = '必须填写用户名和密码'
            raise serializers.ValidationError(msg)

backends.py

from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
from .models import UserInfo

class LoginBackend(ModelBackend):
    # 校验规则可以自己写
    def authenticate(self, request, username=None, password=None, **kwargs):
        user = UserInfo.objects.get(Q(username=username) | Q(phone=username) | Q(email=username))
        if user is not None and user.check_password(password):
            return user

settings.py

AUTHENTICATION_BACKENDS = [
    'app01.backends.LoginBackend'
]

views.py

from rest_framework.viewsets import ViewSet
from rest_framework.response import Response
from .serializer import UserSerializer
from .jwt_response import common_response

class UserView(ViewSet):
    def login(self,request):
        ser = UserSerializer(data=request.data)
        if ser.is_valid():
            username = ser.validated_data.get('user')
            token = ser.validated_data.get('token')
            response_data = common_response(token, username, request)
            response = Response(response_data)
            return response
        return Response(ser.errors)

urls.py

urlpatterns = [
    path('login/',views.UserView.as_view({'post':'login'})),
]

文章来源地址https://www.toymoban.com/news/detail-467133.html

到了这里,关于drf多方式登录接口(手机号、邮箱、验证码)登录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手机号一键授权登录页面

        源码地址:https://ext.dcloud.net.cn/plugin?id=12272

    2024年02月03日
    浏览(39)
  • UNIAPP手机号一键登录

    使用uniapp实现移动端手机号一键登录功能。 uni一键登录 是DCloud联合个推公司推出的,整合了三大运营商网关认证能力的服务。 通过运营商的底层SDK,实现App端无需短信验证码直接获取手机号,也就是很多主流App都提供的一键登录功能 首先需要登录DCloud开发者中心,申请开通

    2023年04月22日
    浏览(23)
  • 微信小程序手机号授权登录

    微信小程序,手机号授权登录需求。 大体流程是这样的: 小程序端使用 getPhoneNumber 向微信平台获取授权 通过微信授权后,小程序端接收微信授权后的回调 小程序携带微信的回调请求自己的服务端 服务端请求微信获取手机号并将手机号回调给小程序端 具体步骤和代码如下:

    2024年02月13日
    浏览(36)
  • taro之--获取手机号并登录

    2024年02月06日
    浏览(23)
  • uniapp实现手机号一键登录功能

    1,第一步 2,第二步 创建应用要和项目uni-appid一致。 3,第三步 4,第四步 5,第五步 6,第六步 7,第七步 8,第八步 (实现代码) 一建登录步骤到此结束,欢迎大家讨论和指导,登录弹窗本文设置的是全屏‘fullScreen’,大家可根据需求编辑,弹窗只能在手机端app才能显示。

    2024年02月16日
    浏览(31)
  • python多方式操作elasticsearch介绍

    ​ requests 是一个 Python HTTP 库,它简化了发送 HTTP 请求和处理响应的过程。通过 requests 模块,开发人员可以轻松地与 Web 服务进行通信,包括获取网页内容、执行 API 请求等。 requests 提供了简洁而直观的 API,使得发送 GET、POST、PUT、DELETE 等类型的请求变得容易。它支持各种认

    2024年04月16日
    浏览(20)
  • 【微信小程序】微信登录和手机号快捷登录:

    一、微信登录: 【1】文档: 【微信官方文档】https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-login/code2Session.html 【2】实现: 二、手机号快捷登录: 【1】文档: 【小程序中获取手机号的 API官方文档】https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/deprecatedGetPhoneN

    2024年02月06日
    浏览(34)
  • 溯源!获取ToDesk登录邮箱和手机号

    这篇文章记录的是这次使用ToDesk过程中发现的问题,可以获取ToDesk的登录邮箱和手机号。起因是前同事让我帮她把D盘的容量再分些给C盘,远程给她处理了下,分区助手专业版就能搞定。 关注【 潇湘信安 】、【 Hack分享吧 】公众号,一起学网络安全知识! 原来安装的ToDesk一

    2024年02月09日
    浏览(32)
  • 【手机号验证/前端】Vue2+elementUI编写一个手机号验证码登录页面,路由式开发(附完整代码)

    目录 效果图: 一、template部分 二、style样式 三、script部分 1.先对手机号的格式进行一个判断 2.接下来就是表单验证规则rules 3.最后就是methods了 (1)首先我们给获取验证码绑定一个方法 (2)然后封装一个axios接口,方便后面测试联调(这部分每个人封装的都不一样) (3)然

    2024年02月17日
    浏览(32)
  • Java - 微信小程序授权手机号登录

            最近做了一个关于商城的项目,B端选用若依的开源框架,C端还是vue前后端分离。其中C端主要是小程序的形式,所以想着来总结一下对接微信小程序登录中Java部分遇到的坑即代码分享! 废话不多说,直接上代码! 1、controller 层代码          入参我这边是直接使用

    2024年02月04日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包