我们给用户注册成功以后,会根据他的邮箱给他发送一个激活短信,用户得到发送过来的短信点击进去激活,就可以直接跳转到登陆页面,点击激活以后,Is_active会从0值为1,中间有个重要的过程就是对用户的id进行加密,因为我们要用来判断是哪个用户注册了,就根据唯一标识id来获取用户的邮箱,具体代码如下:
首先进入settings.py设置邮箱发送方:
# 发送邮件配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# smpt服务地址
EMAIL_HOST = 'smtp.163.com'
EMAIL_PORT = 25
# 发送邮件的邮箱
EMAIL_HOST_USER = '@163.com'
# 在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD = '123456'
# 收件人看到的发件人
EMAIL_FROM = '天天生鲜<@163.com>'
然后就是我们的注册验证过程的邮箱加密 user.views.py:
#类视图
class registerView(View):
'''判断请求方式,如果是get请求,证明就是请求到注册页面,如果是post请求证明是注册提交审核'''
def get(self,request):
return render(request,'register.html',{})
def post(self,request):
'''用户注册验证'''
# 获取注册信息
username = request.POST.get('user_name')
password = request.POST.get('pwd')
email = request.POST.get('email')
allow = request.POST.get('allow')
# 进行用户信息校验 all方法就是用来判断3个信息是否一致,都一致为真返回true,否之,false
if not all([username, password, email]):
return render(request, 'register.html', {'errmsg': '数据不完整'})
# 主要就是用来校验邮箱是否合法,
if not re.match(r'^[a-z0-9][\w.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email):
return render(request, 'register.html', {'errmsg': '邮箱不合法'})
# 校验用户是否勾选同意协议
if allow != 'on':
return render(request, 'register.html', {'errmsg': '请勾选协议'})
# 判断注册用户是否以存在,如果不存在就值为空,因为如果查找不到回抛出异常
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
user = None
if user:
return render(request, 'register.html', {'errmsg': '用户名已存在'})
# 将注册信息添加到数据库表中
user = User.objects.create_user(username, email, password)
# #将用户激活状态值为0,因为我们创建默认是激活的
user.is_active = 0
user.save()
# 用户邮箱发送激活验证,验证通过就激活,根据唯一标识id来判断是哪个用户
# 发送的,对用户的id进行加密,防止发生安全隐患
serializer = Serializer(settings.SECRET_KEY, 3600) # 加密方式,加密时间
info = {'confirm': user.id} # 获取用户id
token = serializer.dumps(info) # 对用户id进行加密
token = token.decode() # 默认加密后是byte类型,解密为utf8
# 发送邮件
subject = '天天生鲜给你一封邮件' # 邮件主题
message = '' # 邮件内容
sendir = settings.EMAIL_FROM # 发送方
receiver = [email]
html_message = '<h1>%s,天天生鲜欢迎你到来</h1>请点击以下链接进行激活<br/><a href="http://127.0.0.1:8000/user/active/%s">点击我进行激活</a>' % (
username, token)
send_mail(subject=subject, message=message, from_email=sendir, recipient_list=receiver,
html_message=html_message)
# 防止url逆向,
return redirect(reverse('goods:index'))
class ActiveView(View):
def get(self,request,token):
# 对用户信息进行解密
serializer = Serializer(settings.SECRET_KEY, 3600)
try:
info = serializer.loads(token)
user_id = info['confirm'] # 获取解密id
user = User.objects.get(id=user_id) # 获取用户信息
user.is_active = 1 # 激活
user.save()
# 跳转到登陆页面
return redirect(reverse('user:login'))
except SignatureExpired as e:
return HttpResponse('对不起,激活时间过期')
class LoginView(View):
def get(self,request):
return render(request, 'login.html', {})
User.urls.py:
from django.urls import re_path
from user import views
from user.views import registerView,ActiveView,LoginView
re_path(r'^registerview$',registerView.as_view(),name='register'),#用户注册和验证一体
re_path(r'^activeview/(?P<token>.*)$',ActiveView.as_view(),name='active'),#用户激活
re_path(r'^loginview$',LoginView.as_view(),name='login'),#用户登陆
最后就是看下我们发送的邮箱是否成功:
数据库用户信息及激活状态,is_active代表以及激活: