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


邮件注册

根据官方文档进行: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可用于实现异步任务、定时任务。之后学习并整理。


版权声明:本文为qq_43604376原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。