用户注册模块用户校验(头条项目-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, includeurlpatterns = [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 viewsurlpatterns = [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 viewsurlpatterns = [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);})
)

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

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

相关文章

Sui Move:基本概览一

Module (模块) Move 代码被组织成模块, 可以把一个模块看成是区块链上的一个智能合约 可以通过调用这些模块中的函数来与模块进行交互&#xff0c;可以通过事务或其他 Move 代码来实现, 事务将被发送到并由Sui区块链进行处理&#xff0c;一旦执行完成&#xff0c;结果的更改将…

git 删除当前目录下的所有文件, 重新拉取分支内容

如果你想删除当前目录下的所有文件并重新拉取分支内容&#xff0c;可以按照以下步骤操作。请注意&#xff0c;这将永久删除本地未提交的更改&#xff0c;请确保你已经备份了重要文件。 步骤 1&#xff1a;删除当前目录下的所有文件 运行以下命令删除当前目录下的所有文件&…

[mysql] mariabackup增量备份数据库

增备测试 1. 使用命令&#xff0c;进行一次全备full_back_date mariabackup -u root -p 123456 --backup --target-dir/dbbackup/full_back_$(date %F_%H%M%S)2. 插入一些数据,进行第一次增备full_back_date_inc_date insert into test2.product values (100,"黄金屋1&…

matlab的绘图的标题中(title)添加标量以及格式化输出

有时候我们需要在matlab绘制的图像的标题中添加一些变量&#xff0c;这样在修改某些参数后&#xff0c;标题会跟着一块儿变。可以采用如下的方法&#xff1a; x -10:0.1:10; %x轴的范围 mu 0; %均值 sigma 1; %标准差 y normpdf(x,mu,sigma); %使用normpdf函数生成高斯函数…

微服务的自我修养:从拆分到秩序的进化论

文章背景 还记得我第一次接触微服务的场景&#xff0c;那是一个炎热的夏天。系统上线的前一天&#xff0c;单体应用出了点小问题&#xff0c;结果整个平台瘫痪了&#xff01;所有人手忙脚乱修复&#xff0c;但复杂的代码逻辑让进度异常缓慢。 后来听说可以用微服务架构来拆分系…

YOLOv8从菜鸟到精通(二):YOLOv8数据标注以及模型训练

数据标注 前期准备 先打开Anaconda Navigator&#xff0c;点击Environment&#xff0c;再点击new(new是我下载anaconda的文件夹名称)&#xff0c;然后点击创建 点击绿色按钮&#xff0c;并点击Open Terminal 输入labelimg便可打开它,labelimg是图像标注工具&#xff0c;在上篇…

【c语言】指针 (完结)

一、sizeof和strlen的对比 1、sizeof 前面我们在学习操作符的时候&#xff0c;我们学习了sizeof&#xff0c;知道其是计算变量所占内存的大小的&#xff0c;单 位是字节&#xff0c;如果操作数是数据类型的话&#xff0c;计算的就是这个类型的变量所占的内存空间的大…

成语知识竞赛主持稿及串词

一、开场白 A&#xff1a;尊敬的各位老师 B&#xff1a;亲爱的同学们 合&#xff1a;大家好&#xff01; A&#xff1a;冬日的暖阳带着青春的气息扑面而来&#xff0c;我们迎来了XXX中学精英成语知识大赛。 B&#xff1a;欢迎各位来到成语大赛的现场。 A&#xff1a;成语是中华…

人工智能:人形机器人的开发需求会创造哪些热门的就业岗位?

人形机器人的开发需求会创造以下热门的就业岗位&#xff1a; 研发设计类 机械结构工程师&#xff1a;负责设计人形机器人的机械本体结构&#xff0c;包括关节、骨架、外壳等&#xff0c;需要对机械原理、力学知识有深入理解&#xff0c;熟悉使用CAD、SolidWorks等设计软件。电…

【Rust】结构体定义域实例化

目录 思维导图 1. 结构体的定义与实例化 1.1 结构体的基本概念 1.2 定义结构体 1.3 创建结构体实例 1.4 结构体的定义与实例化示例 2. 访问与修改结构体字段 2.1 访问字段 2.2 修改字段 3. 结构体实例的构造函数 3.1 构造函数的定义 3.2 使用字段初始化简写 4. 结…

vue2修改表单只提交被修改的数据的字段传给后端接口

效果&#xff1a; 步骤一、 vue2修改表单提交的时候&#xff0c;只将修改的数据的字段传给后端接口&#xff0c;没有修改得数据不传参给接口。 在 data 对象中添加一个新的属性&#xff0c;用于存储初始表单数据的副本&#xff0c;与当前表单数据进行比较&#xff0c;找出哪些…

Docker 安装开源的IT资产管理系统Snipe-IT

一、安装 1、创建docker-compose.yaml version: 3services:snipeit:container_name: snipeitimage: snipe/snipe-it:v6.1.2restart: alwaysports:- "8000:80"volumes:- ./logs:/var/www/html/storage/logsdepends_on:- mysqlenv_file:- .env.dockernetworks:- snip…

迁移WSL中的ext4.vhdx文件

文章目录 环境前言过程参阅 环境 Windows11&#xff08;WSL2&#xff09; 前言 今天发现系统C盘的磁盘空间已经严重不足&#xff0c;查找后发现有一个很大的 ext4.vhdx 文件&#xff0c;位置在&#xff1a; C:\Users\ljfro\AppData\Local\Packages\CanonicalGroupLimited.U…

Windows 11更新之后卡顿 (黑神话掉帧严重)问题探索

前提 Windows 11 晚上更新完 24h2 之后&#xff0c;第二天玩黑神话&#xff0c;才40多帧 之前开启插针&#xff0c;可以运行到 120 帧左右 我的配置 9600X 3080 版本退回 用系统自带的 goBack 版本退回 大概不到3分钟 帧数还是不对&#xff0c;于是重做了系统 重做系统 …

50_Lua垃圾回收

1.Lua垃圾回收机制概述 Lua采用了一种自动内存管理机制,称为垃圾回收(Garbage Collection, GC)。垃圾回收的主要目的是回收程序中不再被使用的内存,从而避免内存泄漏。Lua的垃圾回收器负责回收动态分配的对象,如函数、用户数据、表、字符串、线程、内部结构等。Lua的垃圾…

[云原生之旅] K8s-Portforward的另类用法, 立省两个端口

前言 此方法适用于Pod不需要大量连接的情况: 有多个pod在执行任务, 偶尔需要连接其中一个pod查看进度/日志;对pod执行一个脚本/命令; 不适用于大量连接建立的情况: pod启的数据库服务;pod启的Api服务;pod启的前端服务;pod启的Oss服务; Portforward简介 Portforward就是端…

Spring Boot 动态表操作服务实现

Spring Boot 动态表操作服务实现 Spring Boot 动态表操作服务实现1. 环境配置2. JdbcTemplate 的使用2.1 创建动态表2.2 动态添加字段2.3 动态删除字段2.4 动态修改字段类型2.5 删除表的方法实现 3. 小结3.1 可能的优化 Spring Boot 动态表操作服务实现 在现代的应用开发中&am…

宁德时代C++后端开发面试题及参考答案

请阐述面向对象的三大特性。 面向对象编程有三大特性&#xff0c;分别是封装、继承和多态。 封装是指将数据和操作数据的方法绑定在一起&#xff0c;对数据的访问和操作进行限制。这样做的好处是可以隐藏对象的内部细节&#xff0c;只暴露必要的接口给外部。例如&#xff0c;我…

【Linux系统】—— vim 的使用

【Linux系统】—— vim 的使用 1 vim 的基本概念2 vim 的多模式3 命令模式下的命令集3.1 进入/退出其他模式3.2 光标移动命令集3.3 复制/剪切/粘贴/删除命令集3.4 撤销命令集3.5 查找命令集3.6 替换命令集3.7 进入与退出替换模式 4 批量化编译5 底行模式6 vim 小技巧7 vim简单配…

C++11新特性:aligned_storage等空间分配工具

C11对于内存对齐的支持 对齐的数据有助于提高内存的访问效率以及减少程序运行期间因为内存未对齐导致硬件抛出错误的可能。因此在c中&#xff0c;数据的对齐是必不可少的&#xff0c;对于系统而言在默认情况下也是坚持数据对齐这一准则的。关于内存对齐的详细内容可见《C 内存对…