当前位置: 首页 > news >正文

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

相关文章:

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

1 用户注册后端逻辑 1.1 接收参数 username request.POST.get(username) password request.POST.get(password) phone request.POST.get(phone) 1.2 校验参数 前端校验过的后端也要校验&#xff0c;后端的校验和前端的校验是⼀致的 # 判断参数是否⻬全 # 判断⽤户名是否…...

面向对象的基本概念

本篇,来介绍面向对象的基本概念。 1 面向过程与面向对象 面向过程与面向对象,是两种不同的编程思想。 1.1 面向过程 面向过程的思路,是按照问题的解决步骤,将程序分解为一个个具体的函数或过程,然后依次调用这些函数来实现程序的功能。 面向对象的程序设计,程序的执行…...

深度学习每周学习总结R4(LSTM-实现糖尿病探索与预测)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客R6中的内容&#xff0c;为了便于自己整理总结起名为R4&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结1. LSTM介绍LSTM的基本组成部分如何理解与应用LSTM 2. 数据预处理3. 数…...

如何使用 PHP 操作亚马逊 S3 对象云存储

以下是使用PHP与亚马逊S3对象云存储&#xff08;也有其他支持S3协议的云存储服务&#xff0c;原理类似&#xff09;进行交互的常见文档接口使用示例&#xff0c;涵盖了基本的操作如上传文件、下载文件、删除文件、列举文件等内容。 ### 前提条件 1. 首先&#xff0c;你需要获取…...

26_Redis RDB持久化

从这个模块开始带领大家来学习Redis分布式缓存的相关内容,主要学习目标见下: 数据丢失问题:实现Redis数据持久化(RDB和AOF)并发能力问题:搭建Redis主从集群,实现读写分离故障恢复问题:利用Redis哨兵模式,实现健康检测和自动恢复存储能力问题:搭建Redis分片集群,利用…...

标准Android开发jdk和gradle和gradle AGP和AndroidStudio对应版本

还在为用什么gradle版本烦恼吗&#xff1f;编译不过IDE不开始下载第三方库吗&#xff1f;是时候匹配下你的gradle编译版本了&#xff1a; 1.Gradle 各版本支持的 JDK 版本范围如下&#xff1a; Gradle 版本最低支持 JDK最高支持 JDK7.0 - 7.6JDK 8JDK 178.0 - 8.2JDK 11JDK 1…...

太速科技-628-基于VU3P的双路100G光纤加速计算卡

基于VU3P的双路100G光纤加速计算卡 一、板卡概述 基于Xilinx UltraScale16 nm VU3P芯片方案基础上研发的一款双口100 G FPGA光纤以太网PCI-Express v3.0 x16智能加速计算卡&#xff0c;该智能卡拥有高吞吐量、低延时的网络处理能力以及辅助CPU进行网络功能卸载的能力…...

潜力巨大但道路曲折的量子计算

近一年来&#xff0c;由于工作的原因参观访问了一些量子产业园&#xff0c;接触了量子加密计算机、量子云计算等非常炫酷的概念性产品&#xff0c;这与自己一直认为的“量子技术仍然处于实验室研究阶段”的基本判断与认知产生了强烈的冲突&#xff0c;一刹那间&#xff0c;心中…...

LabVIEW驱动电机实现样品自动搜索

利用LabVIEW控制电机驱动相机在XY平面上进行扫描&#xff0c;以检测样品位置。样品最初可能位于相机视野范围之外&#xff0c;需要实现自动搜索样品位置并完成精确定位扫描的功能。该系统需具有以下特点&#xff1a; 高效搜索&#xff1a;能够快速确定样品位置&#xff0c;缩短…...

React Native Hooks开发指南

一、什么是Hooks Hooks 是 React 16.8 的新增特性。在不编写 class 的情况下使用 state 以及其他的 React 特性。Hooks 是一种在函数式组件中使用有状态函数的方法。 二、类组件 componentDidMount、componentDidUpdate 和 componentWillUnmount 这三个函数的组合。 三、常用…...

腾讯云AI代码助手编程挑战赛-厨房助手之AI大厨

腾讯云AI代码助手编程挑战赛-厨房助手之AI大厨 作品简介 身处当今如火箭般迅猛发展的互联网时代&#xff0c;智能聊天助手已然化身成为提升用户体验的关键利器&#xff0c;全方位渗透至人们的数字生活。 紧紧跟随着这股汹涌澎湃的时代浪潮&#xff0c;我毅然投身于极具挑战性…...

ubuntu22.04 gcc,g++从10.5切换到低版本9.5

一、安装gcc-9.5 mkdir gcc cd gcc sudo apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends gcc-9 | grep -v i386 | grep "^\w") sudo dpkg -i *.deb sudo…...

在 WSL 中使用 Jupyter Notebook 的 TensorBoard 启动问题与解决方法

在 WSL&#xff08;Windows Subsystem for Linux&#xff09;环境中&#xff0c;通过 Jupyter Notebook 使用 %tensorboard --logdir outputs有时会出现 “Timed out waiting for TensorBoard to start” 错误。常见原因通常是先前的 TensorBoard 进程尚未结束&#xff0c;占用…...

Spring Boot 2 学习全攻略

Spring Boot 2 学习资料 Spring Boot 2 学习资料 Spring Boot 2 学习资料 在当今快速发展的 Java 后端开发领域&#xff0c;Spring Boot 2 已然成为一股不可忽视的强大力量。它简化了 Spring 应用的初始搭建以及开发过程&#xff0c;让开发者能够更加专注于业务逻辑的实现&am…...

海豚调度DolphinScheduler-3.1.9配置windows本地开发环境

源代码下载地址https://dolphinscheduler.apache.org/zh-cn/docs/3.1.9 1.Zookeeper安装与使用 如图下载解压zookeeper安装包&#xff0c;并创建data和log目录 下载地址 https://archive.apache.org/dist/zookeeper/zookeeper-3.6.4/apache-zookeeper-3.6.4-bin.tar.gz 进入…...

【机器学习:十九、反向传播】

1. 计算图和导数 计算图的概念 计算图&#xff08;Computation Graph&#xff09;是一种有向无环图&#xff0c;用于表示数学表达式中的计算过程。每个节点表示一个操作或变量&#xff0c;每条边表示操作的依赖关系。通过计算图&#xff0c;可以轻松理解和实现反向传播。 计算…...

线形回归与小批量梯度下降实例

1、准备数据集 import numpy as np import matplotlib.pyplot as pltfrom torch.utils.data import DataLoader from torch.utils.data import TensorDataset######################################################################### #################准备若干个随机的x和…...

SpringCloud微服务:基于Nacos组件,整合Dubbo框架

dubbo和fegin的差异 一、Feign与Dubbo概述 Feign是一个声明式的Web服务客户端&#xff0c;使得编写HTTP客户端变得更简单。通过简单的注解&#xff0c;Feign将自动生成HTTP请求&#xff0c;使得服务调用更加便捷。而Dubbo是一个高性能、轻量级的Java RPC框架&#xff0c;提供了…...

Golang 简要概述

文章目录 1. Golang 的学习方向2. Golang 的应用领域2.1 区块链的应用开发2.2 后台的服务应用2.3 云计算/云服务后台应用 1. Golang 的学习方向 Go 语言&#xff0c;我们可以简单的写成 Golang 2. Golang 的应用领域 2.1 区块链的应用开发 2.2 后台的服务应用 2.3 云计算/云服…...

web前端第三次作业---制作可提交的用户注册表

制作可提交的用户注册表: 代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</tit…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...