首页 > 其他分享 >【补充】用户多方式登陆

【补充】用户多方式登陆

时间:2023-08-01 12:12:26浏览次数:35  
标签:username 补充 self 用户 django dict user import 登陆

【补充】用户多方式登陆

【模型表】

from django.db import models

# Create your models here.
from django.contrib.auth.models import AbstractUser


class UserInfo(AbstractUser):

    phone = models.CharField(max_length=32)

【序列化类】

# -*-coding: Utf-8 -*-
# @File : user_serializer .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/8/1
from rest_framework import serializers
from rest_framework_jwt.settings import api_settings
from rest_framework.exceptions import ValidationError
from app01.models import UserInfo
import re

jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER


class UserSerializer(serializers.ModelSerializer):
    username = serializers.CharField(max_length=32)

    class Meta:
        model = UserInfo
        # 继承 ModelSerializer 后,字段是映射过来的
        # 但是username字段是唯一的
        # 反序列化校验的时候,字段自己的规则,会去数据库查询有没有和这个用户,如果有则报错
        # 解决方式:重写 username 字段
        fields = ["username", "password"]  # 只做反序列化的校验

    def validate(self, attrs):
        # attrs : 前端传入的校验过的数据,字段自己的局部钩子
        # (1)获取前端传入的数据
        username = attrs.get('username')  # 拿到的参数可能是手机号/邮箱/用户名
        password = attrs.get('password')
        # (2)校验用户是否存在
        # (2.1)先查找用户
        if re.match(r'^1(3[0-9]|5[0-3,5-9]|7[1-3,5-8]|8[0-9])\d{8}$', username):
            user = UserInfo.objects.filter(phone=username).first()
        elif re.match(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$', 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("用户名或密码错误")

【视图】

from django.shortcuts import render

# Create your views here.
from rest_framework.viewsets import ViewSet
from app01 import models
from app01.serializers.user_serializer import UserSerializer
from rest_framework.response import Response


class UserView(ViewSet):
    back_dict = {"code": 200, "msg": ""}

    def login(self, request):
        # (1)得到序列化类
        user_ser = UserSerializer(data=request.data)
        if user_ser.is_valid():
            user = user_ser.user
            token = user_ser.token
            self.back_dict["token"] = token
            self.back_dict["msg"] = "登陆成功"
            self.back_dict["username"] = user.username
            return Response(self.back_dict)
        else:
            self.back_dict["code"] = 101
            self.back_dict["msg"] = user_ser.errors

            return Response(self.back_dict)

【路由】

from django.contrib import admin
from django.urls import path
from app01 import views

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

【配置文件】

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',
    'rest_framework'
]


LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = False

AUTH_USER_MODEL = 'app01.UserInfo'

标签:username,补充,self,用户,django,dict,user,import,登陆
From: https://www.cnblogs.com/dream-ze/p/17596112.html

相关文章

  • Win11:添加用户
    学习自:Win11如何添加用户Win11添加用户账户的方法【详解】-太平洋IT百科提示网上还有别的教程,例如Win11如何创建新用户-百度经验,使用该方法我找不到设备管理器下的本地用户和组,遂作罢。过程1)按住WIN+R,输入netplwiz,进入用户账户页面; 2)添加,不使用Microsoft账户登录3)输入......
  • Hugging News #0731: 新课程重磅发布、用户交流群邀请你加入、真实图像编辑方法 LEDTI
    每一周,我们的同事都会向社区的成员们发布一些关于HuggingFace相关的更新,包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等,我们将其称之为「HuggingNews」。本期HuggingNews有哪些有趣的消息,快来看看吧!......
  • 难以相信Windows 10竟然每月有5亿活跃用户
    微软的Build大会开始之初,CEOSatyaNadella上台后的第一件事,照例是公布一下Windows的增长情况。根据官方统计,目前Windows10的月活跃用户数已经达到了5亿人,这项数据去年九月的时候还是4亿,提升速度可谓非常之稳定(当然,这样的增速跟当初微软宣布免费升级后的那段时间肯定......
  • 【补充】函数和方法的区别
    【补充】函数和方法的区别在编程中,函数和方法是两个相关但又有区别的概念。【1】函数函数是一段可以重复使用的代码块,它接受输入参数并产生输出结果。函数通常独立于任何特定的对象或类,并可以在程序的不同位置被调用和执行。函数可以有返回值,也可以没有返回值。【2】方......
  • 【补充】isinstance()issubclass()
    【补充】isinstance()/issubclass()isinstance()函数和issubclass()函数是Python中的两个内置函数用于判断对象与类之间的关系。【1】isinstance()isinstance()函数用于检查一个对象是否是一个类的实例。它接受两个参数第一个参数是待检查的对象第二个参数是类或类型。......
  • 【补充】docker-compose部署Yapi
    【补充】docker-compose部署Yapi参考博客:docker-compose部署Yapi-知乎(zhihu.com)【1】了解DockerCompose:DockerCompose是Docker官方推出的一个用于定义和运行多个Docker容器的工具。通过使用DockerCompose,你可以使用一个单独的yaml文件来定义多个相关的服务,然后使......
  • 【补充】什么是mock数据
    【补充】什么是mock数据【1】介绍Mock数据是在软件开发过程中使用的一种方式,它用于模拟真实数据源的数据,并且具有相似的数据结构和字段。Mock数据通常被用作在实际的数据源不可用或者无法获得时进行开发、测试和演示。Mock数据的主要目的是在软件开发的早期阶段就提供可......
  • 微软bing(必应)搜索首页右上角三个按钮点击无效, 没有反应. 导致无法登录, 或者登陆了
    1.控制面板>网络和连接>网络和共享中心>点开自己的网>属性 TCP/IPv4改成如下图 2.cmd>ipconfig/flushdns ......
  • FFmpeg方法用法大全【欢迎补充】
    1.定义FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开......
  • 抽奖小程序开发如何提高用户参与度?
    抽奖活动作为一种具有互动性和娱乐性的营销方式,被越来越多的企业和个人采用。而随着移动互联网的发展,抽奖小程序的兴起为抽奖活动的展开提供了便利和创新。然而,如何提高用户参与度成为抽奖小程序开发中的关键问题。接下来广州名锐讯动将从设计策略、奖励机制和用户体验三个方面进行......