2020-07-06--django项目完善--用户激活
2020-07-07 本文已影响0人
program_white
邮箱验证码
用户激活判断
当用户注册之后,我们还是不能直接让他登录,要进一步验证它的真实性,所以,要实现一个发送邮箱的验证码的功能。
1.首先在用户信息类中新建一个控制激活的字段:
#控制激活
is_start = models.BooleanField(default=False,verbose_name='是否激活')
默认为flase,表示未激活
执行数据迁移。
2.修改users/views.py中注册和登录的代码
登录:
当用户输入正确的用户名密码验证通过后,判断该用户的is_start属性是否为True,如果为True,登录并返回相应的next或者index页面。否则返回login.html并携带msg信息。
....
....
#django内置用于验证用户名和密码的方法,有两个参数username和password
#验证成功返回验证对象(数据库中的对象),失败则是None
user = authenticate(username=user_name,password=pass_word)
if user is not None:
if user.is_start: #如果该用户激活成功,允许登录
#登录模块,接受request和成功验证返回的user对象
login(request,user)
# 判断next
next = request.GET.get('next', '')
if next:
# 如果next存在,就重定向到next值的url
return HttpResponseRedirect(next)
else:
return render(request, 'login.html', {'msg': '该用户未激活'})
#返回重定向到index页面,然后到url中进行匹配
return HttpResponseRedirect(reverse('index'))
注册:
修改register.html中form表单的注册并登录的按钮改为注册,在views.py中在创建了新的user后直接跳转到login页面进行登录,取消login()。
邮箱验证码的实现
1.创建邮箱验证码的模型类
在上一步中限制登录,就是为了发送邮箱验证码。
要验证邮箱验证码,就要存储验证码,所以子啊users/models.py中创建EmailVerifyCode邮箱验证码模型类。
#邮箱验证码模型类
class EmailVerifyCode(models.Model):
code = models.CharField(max_length=20,verbose_name='邮箱验证码')
email = models.EmailField(max_length=200, verbose_name='验证码邮箱')
send_type = models.IntegerField(choices=((1,'register'),(2,'forget'),(3,'change')),verbose_name='验证码类型')
mobile = models.DateTimeField(default=datetime.now,verbose_name='增加时间')
def __str__(self):
return self.code
class Meta:
verbose_name = '邮箱验证码信息'
verbose_name_plural = verbose_name
执行数据迁移
2.封装发送验证码函数
在MXOnline下新建tools目录,该目录存储所需要的工具包。
在tools下新建send_mail_tools.py:
from MXOnline.settings import EMAIL_FORM
from apps.users.models import EmailVerifyCode #发送验证码的模型类
from random import choice,randrange
from django.core.mail import send_mail #发送邮件
#随机数函数
def get_random_code(code_length):
#码源
code_source = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
code = ''
for i in range(code_length):
#随机选择字符
# code+=choice(code_source)
str = code_source[randrange(0,len(code_source)-1,)]
code+=str
return code
#发送邮件的函数
def send_mail_code(email,mail_type):
#1. 创建邮箱验证码对象
email_obj = EmailVerifyCode()
email_obj.email = email #邮箱
email_obj.send_type = mail_type #发送类型
code = get_random_code(6) #获取随机字符
email_obj.code = code
email_obj.save()
#2.发邮件
#判断邮件类型
if mail_type == 1:
send_title = '欢迎注册'
send_body = '请点击以下连接进行激活你的账号:\n http://127.0.0.1:8000/user_active/'+code
#四个必须参数:邮件标题,邮件内容,邮件出发点,邮件发送地址列表
send_mail(send_title,send_body,EMAIL_FORM,[email])
elif mail_type == 2:
pass
elif mail_type == 3:
pass
settings配置:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = False # 是否使用TLS安全传输协议(用于在两个通信应用程序之间提供保密性和数据完整性。)
EMAIL_USE_SSL = True # 是否使用SSL加密,qq企业邮箱要求使用
EMAIL_HOST = 'smtp.163.com' #服务器地址
EMAIL_PORT = 465 #端口号,一般为25
EMAIL_HOST_USERNAME = 'l1694768857@163.com' #邮箱
EMAIL_HOST_PASSWORD = 'dewsded' #密码
EMAIL_FORM = 'l1694768857@163.com' #从哪里发
仅当参考,数据不对,发送不了邮件。
在注册成功后,发送邮件,传递发送邮件地址和邮件类型
邮箱验证处理函数:
#邮箱验证处理
#用户激活,用户在邮件中进入改视图函数中,验证验证码的正确性
def user_active(request,code):
if code: #code是否传过来了,如果是,到数据库中查找是否有该code
email_verlist = EmailVerifyCode.objects.filter(code=code)
if email_verlist: #如果数据库中有这个验证码对象,那么说明验证码一致
email_ver = email_verlist[0] #拿到验证码对象
#获取该对象的email
email = email_ver.email
#通过email在数据库中过滤当前用户对象
user_list = UserProfile.objects.filter(Q(username=email)|Q(email=email))
if user_list:
user = user_list[0] #获取当前对象
user.is_start = True #把该对象激活
user.save()
return HttpResponseRedirect(reverse('login'))
else:
return render(request,'500.html')
else:
return render(request,'500.html')
大概思路就是用户在注册后,不能直接登录,而是调用发送邮件函数,给该用户注册的邮箱中发送邮件,并提示信息,在信息中设置一个动态的有code的url链接,然后捕获这个连接进行处理:如果该链接所携带的code与发送邮件时存入数据库中的一致,那么就把该用户激活。
具体实现,实现不了。因为我也不知道为什么发送不了邮件