文章目录
- 邮件注册
- 发送邮件功能测试
- 基本的邮件注册功能实现
- 完成注册表单
- 完成注册的业务逻辑
- 密码加密功能实现
- 邮件注册确认
- 创建模型
- 修改视图
- 测试
- 处理邮件确认请求
- 修改登录规则
- 测试
邮件注册
根据官方文档进行: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可用于实现异步任务、定时任务。之后学习并整理。