用户注册模块用户校验(头条项目-05)

1 用户注册后端逻辑

1.1 接收参数

username = request.POST.get('username')
password = request.POST.get('password')
phone = request.POST.get('phone')

1.2 校验参数

前端校验过的后端也要校验,后端的校验和前端的校验是⼀致的

# 判断参数是否⻬全
# 判断⽤户名是否是5-8位字符
# 判断密码是否是3-8位字符
# 判断⼿机号是否合法
# 判断参数是否⻬全
if not all([username, password, phone]):
    raise Forbbiden('缺少必传参数')
# 判断⽤户名是否是5-8个字符
if not re.match(r'^[a-zA-Z][a-zA-Z0-9_]{4,7}$', username):
    raise Forbbiden('请输⼊5-8个字符的⽤户名')
# 判断密码是否是3-8个字符
if not re.match(r'^[0-9a-zA-Z]{3,8}$', password):
    raise Forbbiden('请输⼊3-8位的密码')
# 判断⼿机号是否合法
if not re.match(r'^1[3589]\d{9}$', phone):
    raise Forbbiden('请输⼊正确的⼿机号码')

提示:这⾥校验的参数,前端已经校验过,如果此时参数还是出错,说明该请求是 ⾮正常渠道发送的,所以直接禁⽌本次请求

1.3 保存注册数据

  • 这⾥使⽤Django认证系统⽤户模型类提供的 create_user() ⽅法创建新的⽤户。 .
  • 这⾥ create_user() ⽅法中封装了 set_password() ⽅法加密密码。
# 保存注册数据
try:
    Users.objects.create_user(username=username, password=password,
                              phone=phone)
except DatabaseError:
    return render(request, 'register.html', {'register_errmsg': '注
                                             册失败'})
    # 响应注册结果
return http.HttpResponse('注册成功,重定向到⾸⻚')

如果注册失败,我们需要在⻚⾯上 渲染出注册失败的提示信息

<h5 class="title-login">⽤户注册
    {% if register_error %}
    <span class="error-tip">{{ register_error }}</span>
    {% endif %}
</h5>

1.4 响应注册结果

重要提示:注册成功,重定向到⾸⻚

1.4.1 创建newsapp⼦应⽤
$ cd apps
$ python ../../manage.py startapp newsapp

这行命令的作用是在Django项目的根目录下创建一个名为 newsapp的新应用程序,并生成基本的文件结构。这样你就 可以开始在这个应用程序中定义模型、视图、模板 等,以构建你的Web应用。

1.4.2 定义⾸⻚视图
class NewsView(View):
    def get(self, request):
        return render(request, 'index.html')
1.4.3 配置路由
# 1. 配置总路由
from django.contrib import admin
from django.urls import path, re_path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path('^', include(('userapp.urls', 'userapp',), namespace='userapp')),
    re_path('^', include(('newsapp.urls', 'newsapp',), namespace='newsapp')),
]
# 2. 配置⼦路由
from django.urls import re_path
from . import views

urlpatterns = [
    re_path('^$', views.NewsView.as_view(), name='index'),
]

# # 3. 启动服务器,测试⾸⻚
# http://127.0.0.1:8000/

# 4. 响应注册结果:重定向到⾸⻚
return redirect(reverse('newsapp:index'))

1.5 知识要点

1 后端逻辑编写套路:

  • 业务逻辑分析
  • 接⼝设计和定义
  • 接收和校验参数
  • 实现主体业务逻辑
  • 响应结果

2 注册业务逻辑核⼼思想:

  • 保存⽤户注册数据

2 用户注册状态保持

说明:

  • 如果需求是注册成功后即表示⽤户登⼊成功,那么此时可以在注册成功后实现状态保持
  • 如果需求是注册成功后不表示⽤户登⼊成功,那么此时不⽤在注册成功后实现状态保持
  • 芒果头条的需求是:注册成功后即表示⽤户登⼊成功

2.1 login()⽅法介绍

2.1.1 ⽤户登⼊本质
  • 状态保持 
  • 通过认证的⽤户的唯⼀标识信息(⽐如:⽤户ID)写⼊到当前浏览器的 cookie 和服务端的 session 中。
2.1.2 login()⽅法
  • Django⽤户认证系统提供了login()⽅法
  • 封装了写⼊session的操作,帮助我们 快速登⼊⼀个⽤户,并实现状态保持
2.1.3 login()位置
# django.contrib.auth.__init__.py⽂件中。
login(request, user, backend=None)
2.1.4 状态保持 session

数据存储的位置:Redis数据库的1号库

SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "session"

2.2 login()⽅法登⼊⽤户

# 保存注册数据
try:
    user = Users.objects.create_user(username=username, 
                                     password=password, phone=phone)
except DatabaseError:
    return render(request, 'register.html', {'register_error': '注册失败'})

# 登⼊⽤户,实现状态保持
login(request, user)
# 响应注册结果
return redirect(reverse('newsapp:index'))

2.3 ⻚⾯获取当前会话值

<ul class="header-user-links">
    {% if user %}
    欢迎您! <span style="font-weight: bolder;">[ {{
    user.username }} ]</span>
    &emsp;<a href="/logout/">退出登录</a>&nbsp;
    {% else %}
    <li>
        <a href="/login/">登录</a>&nbsp;&nbsp;&nbsp;
        <a href="/register/">注册</a>
    </li>
    {% endif %}
</ul>

3 用户名重复注册校验

3.1 ⽤户名重复注册接⼝设计和定义

3.1.1 请求⽅式
选项⽅案
请求⽅法GET
请求地址 1/usernames/(?P[a-zA-Z0-9_-]{5,8})/count/
3.1.2 请求参数:路径参数
参数名类型是否必传说明
usernamestring⽤户名
3.1.3 响应结果:JSON
响应结果响应内容
code状态码
errmsg错误信息
count记录该⽤户名的个数

3.2 ⽤户名重复注册后端逻辑

class UnameCountView(View):
    """判断⽤户名是否重复注册"""

    def get(self, request, username):

        """
        :param request: 请求对象
        :param username: ⽤户名
        :return: JSON
        """
        count = Users.objects.filter(username=username).count()
        return http.JsonResponse({'code': 200, 'errmsg': 'OK',
                                  'count': count})

3.3 ⽤户名重复注册前端逻辑

if (this.error_username == false) {
    axios.get('/usernames/' + this.username + '/count/', {
        responseType: 'json'
    })
        .then(response => {
            if (response.data.count == 1) {
                this.error_username_msg = '⽤户名已存在';
                this.error_username = true;
            } else {
                this.error_username = false;
            }
        })
        .catch(error => {
            console.log(error.response);
        })
}

3.4 知识要点

1 判断⽤户名重复注册的核⼼思想:

  • 使⽤⽤户名查询对应的记录是否存在,如果存在,表示重复注册,反之,没有重复注册

2 axios发送异步请求套路:

  • 处理⽤户交互
  • 收集请求参数
  • 准备请求地址
  • 发送异步请求
  • 得到服务器响应
  • 控制界⾯展示效果

用户退出登录

4.1 修改base.html

<ul class="header-user-links">
    {% if user.username %}
    欢迎您! <span style="font-weight: bolder;">[ {{ user.username }} ]</span>
    &emsp;<a href="/logout/">退出登录</a>&nbsp;
    {% else %}
    <li>
        <a href="/login/">登录</a>&nbsp;&nbsp;&nbsp;
        <a href="/register/">注册</a>
    </li>
    {% endif %}
</ul>

4.2 配置路由

# userapp/urls.py
from django.urls import path, re_path
from . import views

urlpatterns = [
    re_path('^register/$', views.RegisterView.as_view()),
    re_path('^usernames/(?P<username>[a-zA-Z_]{5,8})/count/$',
            views.UsernameCount.as_view()),
    re_path('^logout/$', views.LogoutView.as_view())
]

4.3 创建视图

class LogoutView(View):
    def get(self, request):
        """
        ⽤户退出登录
        :param request:
        :return:
        """
        logout(request)
        return redirect(reverse('newsapp:index'))

5 用户手机号重复注册校验

5.1 ⼿机号重复注册接⼝设计和定义

5.1.1 请求⽅式
选项⽅案
请求⽅法GET
请求地址/phones/(?P1[3589][0-9]{9})/count/
5.1.2 请求参数:路径参数
参数名类型是否必传说明
mobilestring⼿机号
5.1.3 响应结果:JSON
响应结果响应内容
code状态码
errmsg错误信息
count记录该⽤户名的个数

5.2 ⼿机号重复注册 端逻辑

class PhoneCountView(View):
    """判断⼿机号是否重复注册"""
    def get(self, request, phone):

        """
        :param request: 请求对象
        :param phone: ⼿机号
        :return: JSON
        """
        count = Users.objects.filter(phone=phone).count()
        return http.JsonResponse({'code': 200, 'errmsg': 'OK', 
                                  'count': count})

5.3 ⼿机号重复注册 前端逻辑

if (this.error_phone == false) {
    let url = '/phones/' + this.phone + '/count/';
    axios.get(url, {
        responseType: 'json'
    })
        .then(response => {
            if (response.data.count == 1) {
                this.error_phone_msg = '⼿机号已存在';
                this.error_phone = true;
            } else {
                this.error_phone = false;
            }
        })
        .catch(error => {
            console.log(error.response);
        })
)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux-28 文本管理(一)文本查看,cat,tac,more,less,head,tail

之前提到过linux的几个重要哲学思想&#xff0c;使用纯文本文件保存软件的配置信息是其中之一&#xff0c;所以大多数情况下&#xff0c;我们对整个系统的操作&#xff0c;都是通过编辑它的配置文件来完成&#xff0c;那也就意味着&#xff0c;处理文本文件是我们作为系统管理员…

JVM面试相关

JVM组成 什么是程序计数器 详细介绍Java堆 什么是虚拟机栈 能不能解释一下方法区&#xff1f; 直接内存相关 类加载器 什么是类加载器&#xff0c;类加载器有哪些 什么是双亲委派模型 类加载过程 垃圾回收 对象什么时候可以被垃圾回收器回收 JVM垃圾回收算法有那些 JVM的分代…

【Unity3D】利用IJob、Burst优化处理切割物体

参考文章&#xff1a; 【Unity】切割网格 【Unity3D】ECS入门学习&#xff08;一&#xff09;导入及基础学习_unity ecs教程-CSDN博客 【Unity3D】ECS入门学习&#xff08;十二&#xff09;IJob、IJobFor、IJobParallelFor_unity ijobparallelfor-CSDN博客 工程资源地址&…

Armv8/Armv9架构从入门到精通-介绍

CSDN学院课程连接&#xff1a;https://edu.csdn.net/course/detail/39573 1 讲师介绍 拥有 12 年手机安全、汽车安全、芯片安全开发经验&#xff0c;擅长 Trustzone/TEE/ 安全的设计与开发&#xff0c;对 ARM 架构的安全领域有着深入的研究和丰富的实践经验&#xff0c;能够…

Cesium小知识:pointPrimitive collection 详解

Cesium.PointPrimitiveCollection 是 Cesium 中用于高效管理和渲染大量点(points)的一个类。它允许你创建和管理大量的 PointPrimitive 实例,这些实例可以用来表示地理空间中的点数据,如传感器位置、车辆位置、兴趣点等。与直接使用 Cesium.Entity 相比,PointPrimitiveCol…

Threejs实现 区块链网络效应

大家好&#xff01;我是 [数擎 AI]&#xff0c;一位热爱探索新技术的前端开发者&#xff0c;在这里分享前端和 Web3D、AI 技术的干货与实战经验。如果你对技术有热情&#xff0c;欢迎关注我的文章&#xff0c;我们一起成长、进步&#xff01; 开发领域&#xff1a;前端开发 | A…

GitCode G-Star 光引计划终审前十名获奖项目公示

在技术的浩瀚星空中&#xff0c;GitCode 平台上的 G-Star 项目熠熠生辉。如今&#xff0c;“光引计划” 已圆满落幕&#xff0c;众多 G-Star 项目作者&#xff0c;一同分享项目在 GitCode 平台托管的宝贵体验&#xff0c;并深入挖掘平台的多样玩法。 众多投稿纷至沓来&#xf…

VRRP技术

堆叠 堆叠指将支持堆叠特性的交换机通过堆叠线缆连接到一起&#xff0c;解决交换机问题 &#xff08;物理多台交换机变成逻辑上的一台交换机 去进行一个数据转发&#xff09;聚合解决链路问题在不同的厂商中堆叠的技术: 思科&#xff1a;stackwise 思科智能堆叠VSS Virt…

primitive 的 Appearance编写着色器材质

import { nextTick, onMounted, ref } from vue import * as Cesium from cesium import gsap from gsaponMounted(() > { ... })// 1、创建矩形几何体&#xff0c;Cesium.RectangleGeometry&#xff1a;几何体&#xff0c;Rectangle&#xff1a;矩形 let rectGeometry new…

31_搭建Redis分片集群

Redis的主从复制模式和哨兵模式可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:海量数据存储问题、高并发写的问题。由于数据量过大,单个master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Red…

快速上手 INFINI Console 的 TopN 指标功能

背景 在分布式搜索引擎系统&#xff08;如 Easysearch、Elasticsearch 和 OpenSearch&#xff09;中&#xff0c;性能监控至关重要。为了确保系统的高效运行和资源的合理分配&#xff0c;我们通常需要关注一段时间内关键资源的使用情况&#xff0c;特别是索引、节点和分片的内…

风水算命系统架构与功能分析

系统架构 服务端&#xff1a;Java&#xff08;最低JDK1.8&#xff0c;支持JDK11以及JDK17&#xff09;数据库&#xff1a;MySQL数据库&#xff08;标配5.7版本&#xff0c;支持MySQL8&#xff09;ORM框架&#xff1a;Mybatis&#xff08;集成通用tk-mapper&#xff0c;支持myb…

探索AGI:智能助手与自我赋能的新时代

目录 1 AGI1.1 DeepMind Levels&#xff08;2023年11月)1.2 OpenAI Levels&#xff08;2024年7月&#xff09;1.3 对比与总结1.4 AGI可能诞生哪里 2 基于AI的智能自动化助手2.1 通用型大模型2.2 专业的Agent和模型工具开发框架2.3 编程与代码生成助手2.4 视频和多模态生成2.5 商…

工具推荐:PDFgear——免费且强大的PDF编辑工具 v2.1.12

PDFgear——免费且强大的PDF编辑工具 v2.1.12 软件简介 PDFgear 是一款 完全免费的 PDF 软件&#xff0c;支持 阅读、编辑、转换、合并 以及 跨设备签署 PDF 文件&#xff0c;无需注册即可使用。它提供了丰富的 PDF 处理功能&#xff0c;极大提升了 PDF 文件管理的便捷性和效…

【机器学习】L1正则化与L2正则化

L1&#xff0c;L2正则化解决过拟合问题 目录 过拟合的原因 正则化的目标 L1&#xff0c;L2正则化 L1正则化 L2正则化 从概率的角度来看 L1 正则化与拉普拉斯分布 L2 正则化与高斯分布 过拟合的原因 过拟合发生时&#xff0c;模型学习到了训练数据中的噪声或细节&am…

【PyQt】如何在mainwindow中添加菜单栏

[toc]如何在mainwindow中添加菜单栏 如何在mainwindow中添加菜单栏 主要有两种方法&#xff1a; 1.直接创建mainwindow进行添加 2.使用ui文件加载添加 第二种方法更为常见&#xff0c;可以应用到实际 1.直接创建mainwindow进行添加 import sysfrom PyQt5.QtWidgets import …

1.组件的三大组成部分注意点(结构/样式/逻辑)scoped解决样式冲突/data是一个函数2.组件通信组件通信语法父传子子传父

学习目标 1.组件的三大组成部分注意点&#xff08;结构/样式/逻辑&#xff09; scoped解决样式冲突/data是一个函数 2.组件通信 组件通信语法 父传子 子传父 非父子通信&#xff08;扩展&#xff09; 3.综合案例&#xff1a;小黑记事本&#xff08;组件版&#xff09; …

Sqoop1.4.7安装

环境说明 准备三台服务器&#xff0c;分别为&#xff1a;bigdata141&#xff08;hadoop 主节点&#xff09;、bigdata142、bigdata143确保 hadoop 集群先启动好&#xff0c;hadoop 版本为 3.2.0如果只安装不使用的话&#xff0c;以上可以暂时不用管另准备一台服务器&#xff0…

Oracle重启后业务连接大量library cache lock

一、现象 数据库和前段应用重启后&#xff0c;出现大量library cache lock等待事件。 二、分析解决 本次异常原因是&#xff1a;原因定位3&#xff1a; 库缓存对象无效 Library cache object Invalidations 三、各类情况具体分析如下 原因定位1&#xff1a;由于文字导致的非…

Demo15:DS1302涓流充电时钟芯片

一、实验现象 通过DS1302 涓流充电时钟芯片&#xff0c;在数码管上显示电子时钟时分秒&#xff0c;格式为“XX-XX-XX” 二、核心知识点 - DS1302时序 三、项目结构 main.c /************************************************************************************** 实验名称…