Django drf使用Django自带的用户系统的注册功能实现

news2024/11/29 4:41:20

在写登录功能的时候看着网上的视频学着做,然后看了源码的时候发现了一些有意思的功能,因此写这一篇笔记分享给大家.

1.阅读Django自带用户系统源码

1.1 阅读User类源码

系统自带的用户系统的models文件的位置\site-packages\django\contrib\auth\models.py,打开这个文件发现User类继承的是一个AbstractUser类,因此我们想要使用系统自带的用户系统,只要在models中重新写一个User类,也继承AbstractUser就可以了.
在这里插入图片描述

1.2 阅读AbstractUser类

阅读AbstractUser类,发现了其中的对username字段做的几个处理,第一个就是他添加了一个验证器validators,第二个增加了error_messages,当在我们往数据库中添加用户信息的时候,系统就会自动验证是否符合要求,如果不符合要求,就会返回一个字典,将对应字段的错误返回,这就是我想到的与其他博主所做的不同之处.
在这里插入图片描述

2.创建自己的User类

我想我的用户类中有mobile,username,email,password四个字段,我的需求:

  • mobile,username,email都是不能重复
  • 验证这几个字段的格式
  • 返回的errormessage为中文
    因此我就想到了模仿系统自带的AbstractUser的写法:

2.1 创建验证器

这个验证器是其中主要是验证电话号码和邮箱的格式正误,因为其他的类也可能需要用到验证器,因此我就在项目的utils目录下创建了一个validator.py文件,用于专门存取验证器.
项目根目录\utils\validator.py代码:

# 验证电话号码是否有误
import re
from django.core.exceptions import ValidationError

# 对手机格式进行验证
class UnicodMobileValidator:
    def __call__(self, value):
        if not re.match(r"^1[3-9]\d{9}$", value):
             raise ValidationError("对不起,手机格式有误!")

# 对邮箱格式进行验证
class UnicodEmailValidator:
    def __call__(self, value):
        if not re.match(r"^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$", value):
             raise ValidationError("对不起,邮箱格式有误!")

2.2 创建User类

这里我继承了AbstractUser类,并且重写了其中的方法和属性.
user\models.py代码:

from datetime import timezone

from django.contrib.auth.validators import UnicodeUsernameValidator
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, AbstractUser

from qianxingtong_main.utils.validator import UnicodMobileValidator, UnicodEmailValidator


class User(AbstractUser):
    username_validator = UnicodeUsernameValidator()

    username = models.CharField(
        ("username"),
        max_length=150,
        unique=True,
        help_text=(
            "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only."
        ),
        validators=[username_validator],
        error_messages={
            "unique": ("该用户名已经存在"),
        },
    )

    email = models.EmailField(("email address"), unique=True, validators=[UnicodEmailValidator()],error_messages={"unique": ("邮箱已经存在"),})
    mobile = models.CharField(max_length=15, unique=True, validators=[UnicodMobileValidator()],
                              error_messages={"unique": ("电话号码已经存在")}, verbose_name="手机号码")

    class Meta:
        db_table = "drf_user"
        verbose_name = "用户信息"
        verbose_name_plural = verbose_name

这里在迁移数据的时候可能会出现错误,其中错误的解决方法参考我写的笔记:https://blog.csdn.net/qq_35653657/article/details/128832687 的第三步

3.创建序列化类

user\serializers代码:

from django.contrib.auth.hashers import make_password
from rest_framework import serializers
from user.models import User
class UserSerializer(serializers.ModelSerializer):
    rpassword = serializers.CharField(required=True, write_only=True, help_text="确认密码")
    token = serializers.CharField(max_length=1024, read_only=True, help_text="token认证字符串")
    class Meta:
        model = User
        fields = ["id", "username", "email", "mobile", "password", "token", "rpassword"]
        # write_only:只写入数据库,
        extra_kwargs = {
            "mobile": {
                "write_only": True,
            },
            "email": {
                "write_only": True,
            },
            "id": {
                "read_only": True,
            },

        }

    def validate(self, attrs):
        """校验信息"""
        password = attrs.get("password")
        rpassword = attrs.get("rpassword")
        if password != rpassword:
            # 验证手机号码是否已经被注册
            raise serializers.ValidationError("对不起,确认密码与密码不一致!")
        return attrs

    def create(self, validated_data):
        """保存用户信息"""
        mobile = validated_data.get("mobile")
        username = validated_data.get("username")
        email = validated_data.get("email")

        validated_data.pop("rpassword")  # 移除不需要的数据
        # 对密码进行加密
        raw_password = validated_data.get("password")
        hash_password = make_password(raw_password)
        # 调用序列化器提供的create方法
        user = User.objects.create(
            mobile=mobile,
            username=username,
            password=hash_password,
            email=email
        )
        return user

这个代码就是我与其他的博主不同的地方,我看网上的up主就是把验证的代码写在validate中,但是这里存在的一个问题就是所有的错误都是统一一起打包返回,无法在前端中做对应字段的错误提示.

4.创建views类

user\views代码:


from rest_framework.generics import CreateAPIView
from user.models import User
from user.serializers import UserSerializer

# Create your views here.
class UserViewSets(CreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

5.创建路由

在这里插入图片描述

6.测试接口

在这里插入图片描述
从测试结果就可以看出,针对不同的字段,会返回对应的错误,而不是一起返回的.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/331257.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python爬虫--re模块简介

Python re正则表达式模块用法详解 前面章节介绍了一些系统自带的工具函数,如 id()、max()。这些函数在 Python 启动时会自动加载进来,不需要我们做任何事情。但并不是所有的模块都是自动加载进来的,因为有些模块不常用,它们只是在…

记录一次web server服务器编程过程中的bug

按照书上和视频中的代码比对没有问题,但是read函数输出不了连接的http请求,不断编译了好几遍还是不行,确定是端口的问题 首先,在云服务器中安全规则里已经允许了相应端口,如果还不可以,可以查看一下系统防火…

MyBatis 入门教程详解

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

配电室辅控项目无线组网远程在线控制系统解决方案

方案背景 配电室是电力系统末端配电网中传输、分配电能的主要电气设备场所,是城市配电网系统的重要组成部分,起到保护、计量、分配电能的作用。 长期以来,配电室管理工作一直是供电系统运行管理的薄弱环节之一。一些配电室开关跳闸、危险气…

【C++提高编程】set/ multiset 容器详解(附测试用例与结果图)

目录1 set/ multiset 容器1.1 set基本概念1.2 set构造和赋值1.3 set大小和交换1.4 set插入和删除1.5 set查找和统计1.6 set和multiset区别1.7 set容器排序1 set/ multiset 容器 1.1 set基本概念 简介: 所有元素都会在插入时自动被排序 本质: set/mu…

搜广推 召回层主流策略 (多路召回、Embedding召回)

😄 简单介绍下召回层的框架,不细致讨论。 文章目录 1、多路召回1.1 多路召回的策略1.2 多路召回的优点和缺点2、Embedding召回2.1、Embedding技术分类2.2、如和做Embedding召回Reference1、多路召回 1.1 多路召回的策略 所谓的“多路召回”策略,就是指采用不同的策略、特…

Linux编辑器vim

本文已收录至《Linux知识与编程》专栏! 作者:ARMCSKGT 演示环境:CentOS 7 目录 前言 正文 vim常用方式 进入vim 退出vim vim基本模式及模式功能 命令模式 插入模式 底行模式 替换模式 视图模式 配置vim 自己配置vim 自动化配置…

选择排序基本概念

选择排序基本概念1.选择排序1.1 基本概念1.2 选择排序执行步骤有1.3 对于5个元素的值步骤次数1.4 选择排序大O记法表示2. 将[4,2,7,1,3]进行选择排序 【实战】2.1 第一次轮回步骤2.2 第二次轮回步骤2.3 第三次轮回步骤2.4 第四次轮回步骤3.选择排序代码实现3.1 根据最小值排序3…

TypeScript快速入门

TypeScript快速入门1.TypeScript介绍1.1.TypeScript为什么要为JS添加类型支持1.2.TypeScript相比JS优势2.TypeScript初体验2.1.安装编译TS的工具包2.2.编译并运行TS代码2.3.简化运行TS代码3.TypeScript常用类型3.1.类型注解3.2.常用基础类型3.3.原始类型 number/string/boolean…

前端基础html css js

html&#xff1a;框架 css&#xff1a;美化 jp&#xff1a;交互 HTML 1.基础标签 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>这是我的滴滴滴一个网页</title></head><body><h1>一号 标题&…

Pygame显示文字

使用Pygame显示文字的步骤如图1所示。图1 显示文字的步骤1 Pygame的初始化通过以下代码实现Pygame的初始化。import pygame pygame.init()其中&#xff0c;第1行代码的作用是在程序中导入pygame模块&#xff1b;第2行代码的作用是实现pygame的初始化。2 屏幕的创建使用如下代码…

CacheLib 原理说明

CacheLib 介绍 CacheLib 是 facebook 开源的一个用于访问和管理缓存数据的 C 库。它是一个线程安全的 API&#xff0c;使开发人员能够构建和自定义可扩展的并发缓存。 主要功能&#xff1a; 实现了针对 DRAM 和 NVM 的混合缓存&#xff0c;可以将从 DRAM 驱逐的缓存数据持久…

ESP8266 + STC15基于AT指令通过TCP通讯协议控制IO状态

ESP8266 + STC15基于AT指令通过TCP通讯协议控制IO状态 📌ESP8266 AT固件基于安信可AT固件,相关刷AT固件可以参考《NodeMCU-刷写AT固件》当然WIFI模块也可以是esp01. STC15 单片机采用的是:STC15F2K60S2 晶振频率采用内部:22.1184MHz🌼功能介绍 通过电脑端的网络调试助手…

【C++】类和对象(第一篇)

文章目录1. 面向过程和面向对象初步认识2.类的引入3.类的定义3.1 类的两种定义方式3.2 成员变量命名规则建议4. 类的访问限定符及封装4.1 访问限定符4.2 封装5. 类的作用域6. 类的实例化7. 类对象模型7.1 类对象大小的计算7.2 类对象的存储方式猜测7.3 结构体内存对齐规则复习8…

JDK15 新特性详解,2020-09-15 正式发布

预览版&#xff1a;该功能在当前版本可以使用&#xff0c;如果效果不是很好的话&#xff0c;可能以后的其他版本就会删去该功能。 最终版&#xff1a;该功能在之前版本效果很好&#xff0c;之后的每个版本中都会存在该功能。 Java 5 中的泛型&#xff0c;Java 8 中的 Lambda …

Linux云服务器下怎么重置MySQL8.0数据库密码

文章目录一、修改my.cnf配置文件为mysql免登陆二、免密登陆mysql三.给root用户重置密码1、首先查看当前root用户相关信息&#xff0c;在mysql数据库的user表中2、把root密码置为空3、退出mysql&#xff0c;删除/etc/my.cnf文件中添加进去的skip-grant-tables 重启mysql服务4、使…

FPGA实现AD9708和AD9280波形收发输出HDMI模拟示波器,串口协议帧控制显示,提供工程源码和技术支持

目录1、AD9708芯片解读和电路设计2、AD9280芯片解读和电路设计3、FPGA设计框架4、AD9708波形生成并发送5、AD9280采集接收波形6、HDMI波形显示算法7、串口协议帧控制波形显示8、vivado工程9、上板调试验证10、福利&#xff1a;工程源码获取1、AD9708芯片解读和电路设计 AD9708…

85024A是德科技keysight高频探头

附加功能&#xff1a; 易于执行在线测量出色的频率响应和单位增益探头灵敏度高低失真度规格输入电容&#xff08;在 500 MHz 时&#xff09;&#xff1a;< 0.7pF&#xff08;标称值&#xff09;输入电阻&#xff1a;1 MΩ&#xff08;标称值&#xff09;带宽&#xff1a;30…

2月8日刷题总结

写题一点思路也没有&#xff0c;题解也不能看得很懂。所以系统性的学习DP ing……跟着进度来&#xff0c;因此刷了一些已经刷过的类型的题&#xff08;也算再次熟悉一下&#xff09;P1077 [NOIP2012 普及组] 摆花题目描述小明的花店新开张&#xff0c;为了吸引顾客&#xff0c;…

力扣SQL刷题5

目录597. 好友申请 I&#xff1a;总体通过率602. 好友申请 II &#xff1a;谁有最多的好友603. 连续空余座位1045. 买下所有产品的客户597. 好友申请 I&#xff1a;总体通过率 官方讲的题目太繁琐了&#xff0c;大概就是&#xff08;表2中列1列2不全相同的行数&#xff09;/&a…