美文网首页
2020-07-06--django项目完善--用户激活

2020-07-06--django项目完善--用户激活

作者: program_white | 来源:发表于2020-07-07 17:13 被阅读0次

邮箱验证码

用户激活判断

当用户注册之后,我们还是不能直接让他登录,要进一步验证它的真实性,所以,要实现一个发送邮箱的验证码的功能。

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与发送邮件时存入数据库中的一致,那么就把该用户激活。

具体实现,实现不了。因为我也不知道为什么发送不了邮件

相关文章

网友评论

      本文标题:2020-07-06--django项目完善--用户激活

      本文链接:https://www.haomeiwen.com/subject/iylnqktx.html