11.3 基于Django4的可重用、用户注册和登录系统搭建(优化)

news2024/10/7 18:20:08

文章目录

  • 邮件注册
    • 发送邮件功能测试
    • 基本的邮件注册功能实现
      • 完成注册表单
      • 完成注册的业务逻辑
      • 密码加密功能实现
    • 邮件注册确认
      • 创建模型
      • 修改视图
      • 测试
      • 处理邮件确认请求
      • 修改登录规则
      • 测试


邮件注册

根据官方文档进行:https://docs.djangoproject.com/zh-hans/4.1/topics/email/
为了实现邮件注册的功能,首先申请一个163邮箱账号,并确保SMTP服务开启。
开启SMTP服务,确保能发送邮件
开启pop3服务,确保能接收邮件
在这里插入图片描述
注意:smtp服务支持ssl连接
在这里插入图片描述

发送邮件功能测试

为了实现发送邮件,需要做以下操作:

编辑 loginRegister/settings.py:

在这里插入图片描述
在这里插入图片描述
测试自己给自己发邮件,成功接收
在这里插入图片描述

基本的邮件注册功能实现

完成注册表单

编辑 login/forms.py:在这里插入图片描述

完成注册的业务逻辑

  • 如果用户已经登录,则不能注册,跳转至首页。
  • 如果是GET请求,返回用户注册的HTML页面。
  • 如果是post请求,先验证提交的数据是否通过。若通过,就清洗数据。接下来判断用户名和邮箱是否已经被注册,若未被注册就将注册信息存储到数据库,跳转到登录界面。
  • 额外:为了数据安全性,注册的密码存储到数据库时,先将其加密再存储。(hash加密,也可以使用别的加密方式)

编写 login/views.py

def register(request):
    #pass
    # 如果用户已经登录,则不能注册,跳转至首页。
    if request.session.get('is_login',None):
        return redirect('/index/')
    # post方法
    if request.method=='POST':
        print(request.POST)
        register_form=RegisterForm(request.POST)
        message="请检查填写的内容"
        print(message)
        if register_form.is_valid():#先验证提交的数据是否通过
            # 清洗数据
            username=register_form.cleaned_data.get('username')
            password1=register_form.cleaned_data.get('password1')
            password2=register_form.cleaned_data.get('password2')
            email=register_form.cleaned_data.get('email')
            print("清洗数据")
            # 判断用户名和邮箱是否已经被注册
            same_name_user=SiteUser.objects.filter(name=username)
            print("相同用户名",same_name_user)
            if same_name_user:
                message="用户名已存在"
                print(message)
                return render(request, 'login/register.html', locals())
            same_email_user = SiteUser.objects.filter(email=email)
            if same_email_user:
                message="该邮箱已经被注册"
                return render(request,'login/register.html',locals())
            #将注册信息存储到数据库,跳转到登录界面
            new_user=SiteUser(name=username,password=password1,email=email)
            new_user.save()
            return redirect('/login/')
    #返回用户注册的HTML页面
    register_form=RegisterForm()
    return render(request,'login/register.html',locals()) #将当前变量封装成字典,返回给前端

修改注册页面 : templates/register.html

{% if register_form.captcha.errors %}
   <div class="alert alert-warning" role="alert">
       <strong>注册失败!</strong> 验证码不正确
   </div>
{% elif message %}
   <div class="alert alert-warning" role="alert">
        <strong>注册失败!</strong> {{ message }}
   </div>
{% endif %}

<form action="/register/" method="post">
{% csrf_token %}
   <div class="form-group">
       <label>{{ register_form.username.label }}</label>
       <input type="text" class="form-control" name="username">
   </div>
   <div class="form-group">
        <label>{{ register_form.email.label }}</label>
        <input type="email" class="form-control" name="email">
   </div>
   <div class="form-group">
       <label>{{ register_form.password1.label }}</label>
       <input type="password" class="form-control" name="password1">
       <small class="form-text text-muted">密码必须由数字和大小写字母组成.</small>
   </div>
   <div class="form-group">
       <label>{{ register_form.password2.label }}</label>
       <input type="password" class="form-control" name="password2">
       <small class="form-text text-muted">密码必须由数字和大小写字母组成.</small>
   </div>
   <div class="form-group">
        <label>{{ register_form.captcha.label }}</label>
        {{ register_form.captcha }}
        </div>
  <a href="/login/" class="text-success">
    <ins>用户登录</ins>
  </a>
  <button type="submit" class="btn btn-primary float-right">注册</button>
 </form>

浏览器测试:
在这里插入图片描述

密码加密功能实现

加密密码有很多不同的途径(sha1()、sha256()、md5()等等),其安全程度也不同。这里使用pyhon内置的 hashlib 库,使用哈希值的方式加密密码。安全等级可能不够高,但是足够简单、方便。

在 login 下添加文件 utils.py ,编写加密函数
在这里插入图片描述
在 login/views.py 文件中,修改注册函数,使用户注册的密码先加密后再保存到数据库中。
在这里插入图片描述
相应的,在登录函数中,设置先将用户输入的密码加密,然后和数据库中加密的密码相比较。如果两者相同就登录成功。
在这里插入图片描述

邮件注册确认

使用邮件确认的方式对新注册用户进行审查,既安全又正式,也是目前很多站点的做法。

创建模型

为了区分通过和未通过邮件确认的用户,就需要给用户添加一个是否进行过邮件确认的属性。
在这里插入图片描述
还需要创建一张新表,用于保存用户的确认码以及注册提交的时间。
在这里插入图片描述
数据库更改,一定要生成迁移脚本和写入数据库
在这里插入图片描述

为了方便修改和观察数据,修改 login/admin.py
在这里插入图片描述
在这里插入图片描述

修改视图

在login/views.py 文件,修改 注册函数register ,当注册的用户名和邮箱均合法,在将注册信息写入数据库之后,给用户发送确认邮件,若发送出现异常,就删除该用户。
在这里插入图片描述

在 login/utils.py 内完成生成确认码的函数:
在这里插入图片描述

在 login/utils.py 内完成发送邮件的函数:
在这里插入图片描述

设置确认邮件失效时间
在这里插入图片描述

测试

注册用户,判断是否能受到确认邮件
在这里插入图片描述

处理邮件确认请求

在 login子应用的 urls.py 中添加一条 url :

在这里插入图片描述
在 login/views.py 中添加 user_confirm 视图函数:

  • 首先获取用户的验证码
  • 从数据库中查询,如果没有确认码,就是无效请求
  • 如果数据库有确认码,则检查其有效期,如果过期就删除用户信息。否则,更新用户信息
    在这里插入图片描述

修改为不使用时区,否则会出现时间对比错误
在这里插入图片描述

在 login/templates/login 下面创建一个 confirm.html :

在这里插入图片描述

修改登录规则

修改登录规则,未进行邮件确认的用户不能登录
在这里插入图片描述

测试

注册新用户之后,收到邮箱确认邮件
在这里插入图片描述
点击验证
在这里插入图片描述

使用新账户能登录成功:
在这里插入图片描述

其他:Celery可用于实现异步任务、定时任务。之后学习并整理。

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

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

相关文章

什么是智慧实验室?

智慧实验室是利用现代信息技术和先进设备将实验室实现智能化和智慧化的概念。通过将各种数据、信息和资源整合在一起&#xff0c;实现实验室设备的互联互通&#xff0c;数据的实时采集、传输、处理和分析&#xff0c;从而提高实验室的效率、精度和可靠性。一、智慧实验室包含多…

Java~对于代码块与内部类的理解

目录 代码块 普通代码块 构造代码块 静态代码块 内部类 成员内部类 普通内部类 静态内部类 局部内部类 代码块 使用“{}”定义的一段代码成为代码块&#xff0c;代码块分为普通代码块、构造代码块、匿名代码块、同步代码块。 普通代码块 定义在方法中的代码&#x…

【go语言之thrift协议一】

go语言之thrift协议thrift文件shared.thriftSharedStructSharedServiceSharedServiceProcessorSharedServiceGetStructArgsSharedServiceGetStructResulttutorial.thrift基本数据类型引入其他thrift文件自定义类型定义常量enum继承thrift 相对于grpc而言&#xff0c;可能用的不…

逆向-还原代码之max 再画堆栈图 (Interl 64)

// source code #include <stdio.h> void max(int * a, int * b) { if (*a < *b) *a *b; } int main() { int a 5, b 6; max(&a, &b); printf("a, b max %d\n", a); return 0; } // 再画堆栈图 下周一&#xff08;2.27…

JavaEE简单示例——MyBatis关联映射

简单介绍&#xff1a; 在我们之前的案例中&#xff0c;我们进行了简单查询&#xff0c;条件产村&#xff0c;动态SQL的条件查询&#xff0c;但是这些操作都是在一张表中进行的&#xff0c;而在我们之前学习MySQL中还有一个很重要的操作就是多表查询操作&#xff0c;也就是说通…

图像亮度调整

非线性方式 调整图像的方法有很多&#xff0c;最常用的方法就是对图像像素点的R、G、B三个分量同时进行增加&#xff08;减少&#xff09;某个值&#xff0c;达到调整亮度的目的。即改变图像的亮度&#xff0c;实际就是对像素点的各颜色分量值做一个平移。这种方法属于非线性的…

适用于产研团队协作工具有哪些?盘点6大类协同办公软件

团队协作工具在提高团队协作效率、质量和灵活性&#xff0c;降低成本等方面都有着不小的作用。而根据协作内容、团队等特点的不同&#xff0c;团队协作工具可以分为多种类型&#xff0c;常见的包括&#xff1a;即时通讯工具&#xff0c;用于实时交流和沟通&#xff0c;其中又可…

SpringBoot整合JPA+人大金仓(kingbase8)

陈老老老板&#x1f9b8;&#x1f468;‍&#x1f4bb;本文专栏&#xff1a;国产数据库-人大金仓&#xff08;kingbase8&#xff09;&#xff08;主要讲一些人大金仓数据库相关的内容&#xff09;&#x1f468;‍&#x1f4bb;本文简述&#xff1a;本文讲一下Jpa框架整合人大金…

Spring Cloud Nacos源码讲解(三)- Nacos客户端实例注册源码分析

Nacos客户端实例注册源码分析 实例客户端注册入口 流程图&#xff1a; 实际上我们在真实的生产环境中&#xff0c;我们要让某一个服务注册到Nacos中&#xff0c;我们首先要引入一个依赖&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId><…

Bootstrap入门到精通(最全最详细)

文章目录前言一、Bootstrap是什么&#xff1f;二、Bootstrap安装方式一&#xff1a;将压缩包下载到本地引入使用方式二&#xff1a;使用Bootstrap官方cdn二.Bootstrap容器下面是屏幕宽度在不同大小时不同容器的显示状态三.Bootstrap栅格系统bootstrap网格系统有以下六个类网格系…

上岸!选择你的隐私计算导师!

开放隐私计算 开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区”。183篇原创内容公众号…

剑指 Offer 55 - I. 二叉树的深度

摘要 剑指 Offer 55 - I. 二叉树的深度 一、深度优先搜索 如果我们知道了左子树和右子树的最大深度l和r&#xff0c;那么该二叉树的最大深度即为&#xff1a;max(l,r)1。 而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」的方法来计…

JTT808jt1078

List item 前言 交通部与2016年10月份推出了JT/T 1078-2016标准&#xff0c;全称是<道路运输车辆卫星定位系统视频通信协议> 实时音视频传输指令 实时音视频传输请求 消息 I&#xff24;&#xff1a;&#xff10;x9101。 报文类型&#xff1a;信令数据报文。 平台向终…

C语言深入知识——(1)整形数据和浮点数据的存储

1、数据类型的介绍 类型的意义&#xff1a; 使用对应类型能开辟对应内存空间的大小&#xff08;使用范围&#xff09;还有C语言对待不同类型&#xff0c;会采用不同的内存空间视角来看待一个数据 C语言中类型的基本归类&#xff1a; 整型&#xff08;内置类型&#xff09;浮点…

SAP ABAP——SAP简介(六)【ABAP技术栈简介】

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计专业大二本科在读&#xff0c;阿里云社区专家博主&#xff0c;华为云社区云享专家&#xff0c;CSDN SAP应用技术领域新兴创作者。   在学习工…

黑吃黑的 Prynt Stealer 在恶意软件中嵌入后门

窃密对于网络犯罪来说&#xff0c;始终都是不可缺少的一部分。攻击者可以通过窃密获取更多信息&#xff0c;来判断攻击目标的价值高低&#xff0c;从而最大化自己的利益。为了使技术不太高的普通攻击者也能够使用&#xff0c;包括 Prynt Stealer 在内的信息窃取类恶意软件通常都…

工赋开发者社区 | 工业数字孪生:西门子工业网络与设备虚拟调试案例(TIA+MCD+SINETPLAN)

PART1案例背景及基本情况新生产系统的设计和实施通常是耗时且高成本的过程&#xff0c;完成设计、采购、安装后&#xff0c;在移交生产运行之前还需要一个阶段&#xff0c;即调试阶段。如果在开发过程中的任何地方出现了错误而没有被发现&#xff0c;那么每个开发阶段的错误成本…

Linux服务:Nginx服务重写功能

目录 一、重写功能 1、重写功能作用 2、rewrite指令 ①if指令 ②return指令 ③ set指令 ④break指令 3、rewrite标志 ①redirect标志 ②permanent标志 ③break标志 ④last标志 ⑤rewrite标志实验 一、重写功能 1、重写功能作用 重写功能(rewrite)用于实现URL的重…

CentOS 8利用Apache安装部署下载服务器

1&#xff1a;部署的目的是做一个类似下面开源镜像网站&#xff0c;把一些软件或者资料上传到服务器上面&#xff0c;减少用户在互联网上下载资料&#xff0c;提高效率&#xff0c;减少病毒。 2&#xff1a;使用下面的命令配置本机的IP地址主机名等信息。后期使用IP地址进行访问…

CRF条件随机场 | 关键原理+面试知识点

&#x1f604; CRF之前跟人生导师&#xff1a;李航学习过&#xff0c;这里结合自己的理解&#xff0c;精简一波CRF&#xff0c;总结一下面试中高频出现的要点。个人觉得没网上说的那么复杂&#xff0c;我看网上很大部分都是一长篇先举个例子&#xff0c;然后再说原理。没必要原…