测试平台——用户模块开发

news2024/9/22 13:31:10

这里写目录标题

  • 一、创建子应用
  • 二、用户注册设计
    • 1、用户注册模型类设计
      • a、Django认证系统提供了用户模型类User,为什么还要定义User模型类?
      • b、AbstractUser
      • c、自定义用户模型类的字段有
      • d、User模型类编写好了就可以了吗?
    • 2、用户注册序列化器类设计
      • a、注意
      • b、单字段进行校验
      • c、用户认证的时候为什么不用create,而用create_user呢?
      • d、代码展示
    • 3、用户注册视图类设计
      • a.注意
      • b.APIView子类
    • 4.路由配置
      • a.特别注意:
  • 三、用户验证
    • 1、需要配置如下内容
      • a、指定认证方式
      • b、自定义JWT认证成功之后返回的响应格式
      • c、截图所示
    • 2、验证

一、创建子应用

一个项目往往会包含多个子应用,直接放在项目根目录不便于管理。

在当前目录的apps目录下创建子应用

python manage.py startapp users

在这里插入图片描述
优化导入路径

sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

在这里插入图片描述
注册子应用
在这里插入图片描述

二、用户注册设计

1、用户注册模型类设计

a、Django认证系统提供了用户模型类User,为什么还要定义User模型类?

Django认证系统提供了用户模型类User,具体位置:django.contrib.auth.models.User;
因为Django认证系统提供的用户模型类User中缺少我本次项目中需要的字段,需要重写定义User模型类,最好不要和User重名,我以UserModel命令

b、AbstractUser

自定义的User需要继承AbstractUser,同时还需要继承BaseModel
AbstractUser源码如下:

class AbstractUser(AbstractBaseUser, PermissionsMixin):
    username_validator = UnicodeUsernameValidator()
    .....

class User(AbstractUser):
    class Meta(AbstractUser.Meta):
        swappable = 'AUTH_USER_MODEL'

c、自定义用户模型类的字段有

mobile
代码如下

import re

from django.db import models
from django.contrib.auth.models import AbstractUser


# Create your models here.

class User(AbstractUser):
    mobile = models.CharField('电话号码',
                              max_length=20,
                              help_text='电话号码',
                              null=True, blank=True,
                              )

    class Meta:
        db_table = 't_user'
        verbose_name = '用户表'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.username

    REQUIRED_FIELDS = ['mobile']  # 再通过createsuperuser管理命令创建用户时,将提示输入mobile字段

d、User模型类编写好了就可以了吗?

当然不是了,Django不会识别到你自己定义的User模型类,此时Django还是识别系统自带的User模型类,那需要怎么做
需要在settings.py配置文件中配置

特别注意:添加自定义用户模型类(应用名字.模型类名)

AUTH_USER_MODEL='users.User'

2、用户注册序列化器类设计

a、注意

1、extra_kwargs:当对模型类中定义的字段进行细微的调整时,在序列化器类中使用extra_kwargs进行调整
2、模型类中字段如果有设置为unique=True时,当校验不通过,在序列化输出时,并不是我想要的校验结果,可以通过
"validators": [UniqueValidator(queryset=UserModel.objects.all(), message='用户名已注册,请重新输入')],进行自定义.

3、一定要记住password字段,一定不能输出,要设置为’write_only’: True,

b、单字段进行校验

当在extra_kwargs={}中没法进行细微的调整时,需要进行单字段校验
采用validate_属性名称
例如当对手机号进行校验时,

用validate_phone(attr)

必须返回attr
拓展:

多字段校验:validate(attrs)

c、用户认证的时候为什么不用create,而用create_user呢?

UserModel.objects.create(**validated_data):
create:只会将反序列化输入校验通过的字段,原样插入到数据库中,因为密码是不能直接插入到数据中的
所以必须要重写create方法.

代码如下:

def create(self,validated_data):
    '''必须重写create函数,因为用户密码是不能直接插入到数据库的'''
    user=UserModel.objects.create_user(**validated_data)
    return user

d、代码展示

import re

from rest_framework.validators import UniqueValidator, ValidationError
from rest_framework import serializers

from .models import User


class RegisterSerializer(serializers.ModelSerializer):
    password_confirm = serializers.CharField(write_only=True,
                                             label='确认密码',
                                             help_text='确认密码',
                                             min_length=6,
                                             max_length=20,
                                             error_messages={
                                                 'min_length': '仅允许6-20个字符的密码',
                                                 'max_length': '仅允许6-20个字符的密码'
                                             })

    class Meta:
        model = User
        fields = ['id', 'username', 'password', 'mobile', 'email', 'password_confirm']

        extra_kwargs = {
            'username': {
                'label': '用户名',
                'help_text': '用户名',
                'min_length': 2,
                'max_length': 20,
                'error_messages': {
                    'min_length': '仅允许2-20个字符的密码',
                    'max_length': '仅允许2-20个字符的密码'
                }
            },
            'password': {
                'label': '密码',
                'help_text': '密码',
                'write_only': True,
                'min_length': 6,
                'max_length': 20,
                'error_messages': {
                    'min_length': '仅允许6-20个字符的密码',
                    'max_length': '仅允许6-20个字符的密码'
                }
            },
            'email': {
                'label': '邮箱',
                'help_text': '邮箱',
                'required': True,
                'allow_blank': True,
                'validators': [
                    UniqueValidator(queryset=User.objects.all(), message='此邮箱已注册')
                ]
            }
        }

    def validate_mobile(self, value):
        if not re.match(r'1[3-9]\d{9}', value):
            raise ValidationError("手机号码格式不正确")
        return value

    def validate(self, attrs):
        password = attrs.get('password')
        password_confirm = attrs.get('password_confirm')
        if not password == password_confirm:
            raise serializers.ValidationError('您2次输入的密码不一致')
        return attrs

    def create(self, validated_data):
        validated_data.pop('password_confirm')
        # 调用create_user方法,处理密码加密的问题
        return User.objects.create_user(**validated_data)

3、用户注册视图类设计

a.注意

当视图类中需要用的接口包括增删改查查时,不用想直接继承ModelViewSet即可
当视图类中只实现某1个功能,只需要继承特定的视图类即可,不能继承ModelViewSet.
因为会有漏洞,不法分子会恶意访问接口进行修改数据.

b.APIView子类

ListAPIView
CreateAPIView
UpdateAPIView
RetrieveAPIView
DestroyAPIView
ListCreateAPIView
RetrieveUpdateAPIView
RetrieveDestroyAPIView
RetrieveUpdateDestroyAPIView

from django.shortcuts import render

# Create your views here.
from rest_framework.viewsets import ModelViewSet
from rest_framework.permissions import IsAuthenticated
from rest_framework import generics

from .models import User

from .serializers import RegisterSerializer


class UserRegisterView(generics.CreateAPIView):
    queryset = User.objects.all()
    serializer_class = RegisterSerializer

4.路由配置

from django.urls import path,include
from . import views
from rest_framework import routers
from rest_framework_jwt.views import obtain_jwt_token

urlpatterns=[
    path('users/login/',obtain_jwt_token),
    path('register/',views.UserRegisterView.as_view())

a.特别注意:

当数据库脚本生成和迁移操作时,如果数据库中没有生成对应的表,
首先需要检查模型类设计是否正确;
接着将迁移脚本都删除,同时将数据库中的表也删除
重新执行迁移脚本(init.py文件不要删)

在这里插入图片描述

三、用户验证

1、需要配置如下内容

a、指定认证方式

REST_FRAMEWORK = {

    # 指定使用的认证类
    # a、在全局指定默认的认证类(认证方式)
    'DEFAULT_AUTHENTICATION_CLASSES': [
        # 1、指定jwt token认证
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    ],
    # 'DEFAULT_PERMISSION_CLASSES':(
    #     'erp_project.utils.rbac_permissions.RbacPermission'
    # )
# 过滤
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
}


# JWT配置
JWT_AUTH = {
    # 指定token失效时间为1天
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
    # 使用自己的jwt_response_payload_handler,目的是响应结果中可以返回用户名和id
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'utils.jwt_handler.jwt_response_payload_handler',

}

b、自定义JWT认证成功之后返回的响应格式

def jwt_response_payload_handler(token, user=None, response=None):
    '''自定义JWT认证成功之后返回的响应格式'''
    return {
        'id': user.id,  # 返回登录用户的id
        'username': user.username,  # 用户名
        'token': token
    }

c、截图所示

在这里插入图片描述
在这里插入图片描述

2、验证

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

基于分级安全的OpenHarmony架构设计

本文转载自 OpenHarmony TSC 官方微信公众号《峰会回顾第1期 | 基于分级安全的OpenHarmony架构设计》 演讲嘉宾 | 付天福 回顾整理 | 廖 涛 排版校对 | 李萍萍 嘉宾简介 付天福,OpenHarmony技术指导委员会安全及机密计算TSG负责人,华为公司科学家委员会…

机器人“瓦力”近在咫尺?谷歌最新的RT-2 AI模型简介

“首创”的机器人 AI 模型能够识别垃圾并执行复杂的动作。 上周五,谷歌 DeepMind 宣布了机器人变形器 2(RT-2),这是一种“首次推出”的视觉-语言-行动(VLA)模型,利用从互联网上抓取的数据&…

理解 CSS 中的 Containing Block

前言 在开始本文之前先来看一个例子&#xff0c;下面一段简单的 html 代码&#xff0c;布局很简单&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"w…

clickhouse调研报告2

由Distributed表发送分片数据 clickhouse分区目录合并 clickhouse副本协同流程 clickhouse索引查询逻辑 clickhouse一级索引生成逻辑(两主键) clickhouse的data目录下包含如下目录: [root@brfs-stress-01 201403_10_10_0]# ll /data01/clickhouse/data total 4 drwxr-x---…

【Linux操作系统】网络配置详解:从原理到实践(详细通俗讲明DNS)

导语&#xff1a;网络配置是Linux系统中的一项重要任务&#xff0c;合理的网络配置可以保证计算机与其他设备的正常通信。本文将详细介绍Linux网络配置的原理和实践&#xff0c;包括网络配置原理、查看网络IP和网关、测试网络连通性、网络环境配置、设置主机名和hosts映射以及主…

获取全部的地区并生成表格

思路 写文章的时间2023-8-4&#xff0c;大部分网页设置的区域都是先是省&#xff0c;然后通过省获取对应的市&#xff0c;再通过市获取对应的区&#xff0c;以此类推。所以模拟的请求也是按照这个逻辑&#xff0c;先获取所有的省&#xff0c;再获取所有的市&#xff0c;最后获取…

【2023华数杯全国大学生数学建模竞赛】C题 母亲身心健康对婴儿成长的影响第一、二问

第一问部分截图 第二问部分截图 参考文献 理论和可直接运行代码获取参见&#xff1a;理论和可直接运行代码获取参见&#xff1a;理论和可直接运行代码获取参见&#xff1a;理论和可直接运行代码获取参见&#xff1a; 有人看的话更新后续问题思路。

【项目经验】产研流程(超级详细的步骤)

一、产研流程简述 项目立项-——定需求——Sprint需求宣讲会——技术方案——技术方案评审会——开发及单元测试——测试用例评审会——提测——测试——Sprint评审会——发版——Sprint复盘会 二、产研流程详情 以下部分根据Sprint里程碑节点进行循环&#xff08;sprint周期…

Java8实战-总结12

Java8实战-总结12 Lambda表达式Lambda 和方法引用实战第1步&#xff1a;传递代码第2步&#xff1a;使用匿名类第3步&#xff1a;使用Lambda表达式第4步&#xff1a;使用方法引用 复合Lambda表达式的有用方法比较器复合逆序比较器链 函数复合 Lambda表达式 Lambda 和方法引用实…

【C++】从无到有了解并掌握C++面向对象编程的三大特性——封装、继承、多态

前置知识&#xff1a;类和对象 参考书籍&#xff1a;《C Primer 第五版》 目录 什么是面向过程&#xff1f;什么是面向对象&#xff1f; 一、封装 1、封装的含义以及如何实现封装 1.1 访问限定符&#xff08;访问说明符&#xff09; 1.2 什么是封装&#xff1f; 2、封装的优点…

2023年华数杯选题人数发布!!

该选题人数&#xff0c;主要基于根据各个平台开赛后12小时各项数据统计&#xff0c;进行评估&#xff08;方法见注释&#xff09;&#xff0c;最终得出2023年华数杯选选题人数&#xff0c;大致为 题号选题人数A120B159C420 注释&#xff1a;选题人数来源&#xff1a;源自各个平…

Java字符串常量池以及new String(“abc“)到底创建了几个对象?各种字符串到底相不相等?

new String(“abc”)到底创建了几个对象&#xff1f; 字符串常量池 是 JVM 为了提升性能和减少内存消耗针对字符串&#xff08;String 类&#xff09;专门开辟的一块区域&#xff0c;主要目的是为了避免字符串的重复创建。 1.如果字符串常量池中不存在“abc”的引用&#xff…

GD32F103VE外部中断

GD32F103VE外部中断线线0~15&#xff0c;对应外部IO口的输入中断。它有7个中断向量&#xff0c;外部中断线0 ~ 4分别对应EXTI0_IRQn ~ EXTI4_IRQn中断向量&#xff1b;外部中断线 5 ~ 9 共用一个 EXTI9_5_IRQn中断向量&#xff1b;外部中断线10~15 共用一个 EXTI15_10_IRQn中断…

深入探索Vue.js核心技术与跨平台开发uni-app实战

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 前言 在当今Web应用不断…

小程序商城免费搭建之java商城 电子商务Spring Cloud+Spring Boot+二次开发+mybatis+MQ+VR全景+b2b2c bbc

​ 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前…

7、Kubernetes核心技术 - Secret

目录 一、Secret概述 二、Secret 三种类型 2.1、Opaque 2..2、kubernetes.io/dockerconfigjson 2.3、kubernetes.io/service-account-token 三、Secret创建 3.1、命令行方式创建 Secret 3.2、yaml方式创建 Secret 四、Secret解码 五、Secret使用 5.1、将 Secret 挂载…

Mybatis实现JsonObject对象与JSON之间交互

项目中使用PostGresql数据库进行数据存储&#xff0c;表中某字段为Json类型&#xff0c;用于存储Json格式数据。PG数据库能够直接存储Json算是一大特色&#xff0c;很多特定情境下使用直接存储Json字段数据能够大量节省开发时间&#xff0c;提高后台数据查询和转换效率。 1、基…

第三章 图论 No.1单源最短路及其综合应用

文章目录 1129. 热浪1128. 信使1127. 香甜的黄油1126. 最小花费920. 最优乘车903. 昂贵的聘礼1135. 新年好340. 通信线路342. 道路与航线341. 最优贸易 做乘法的最短路时&#xff0c;若权值>0&#xff0c;只能用spfa来做&#xff0c;相等于加法中的负权边 1129. 热浪 1129.…

Spring接口ApplicationRunner的作用和使用介绍

在Spring框架中&#xff0c;ApplicationRunner接口是org.springframework.boot.ApplicationRunner接口的一部分。它是Spring Boot中用于在Spring应用程序启动完成后执行特定任务的接口。ApplicationRunner的作用是在Spring应用程序完全启动后&#xff0c;执行一些初始化任务或处…

W6100-EVB-PICO做DNS Client进行域名解析(四)

前言 在上一章节中我们用W6100-EVB-PICO通过dhcp获取ip地址&#xff08;网关&#xff0c;子网掩码&#xff0c;dns服务器&#xff09;等信息&#xff0c;给我们的开发板配置网络信息&#xff0c;成功的接入网络中&#xff0c;那么本章将教大家如何让我们的开发板进行DNS域名解…