Django实战搭建mock系统(六)_邮件发送令牌,点击令牌激活账号

一.发送包含令牌的邮件

现在很多网站都有激活流程,就是登录的时候给你绑定的邮箱发送一个网址,然后你打开自己的邮箱,点击发送过来的网址或者发送过来的令牌,从而完成激活流程。
典型的有steam或者switch注册,比如这样:
在这里插入图片描述

在models里面新建一个model,字段如下:
在这里插入图片描述

class EmailVerify(models.Model):
    code = models.CharField(
        max_length=6,
        verbose_name='令牌'
    )
    email = models.EmailField(
        max_length=30,
        verbose_name='邮箱',
    )
    send_type = models.CharField(
        max_length=15,
        choices=(('register','注册'),('forget','找回密码')),
        verbose_name='验证码类型'
    )
    send_time = models.DateField(
        default=datetime.now,
        verbose_name='发送时间'
    )
    class Meta:
        verbose_name='邮箱令牌'
        verbose_name_plural = verbose_name

然后把这个model同步到数据库里,还是migrate的那两个命令
在这里插入图片描述

接下来实现发送邮件的功能,这个功能在刚开始做WEB UI自动化的时候做过
在项目根目录下新建一个Utils文件夹,里面还是像之前一样存放项目都能使用的公用方法
在这里插入图片描述

在settings里配置发送邮件的邮箱
在这里插入图片描述
在这里插入图片描述

EMAIL_HOST = 'smtp.163.com'
EMAIL_PORT = 25
EMAIL_HOST_USER = 'lsqtester001@163.com'
EMAIL_HOST_PASSWORD= 'RNLNACWXIYDTWTKJ'   #这个是授权码不是登录密码
EMAIL_FROM = 'lsqtester001@163.com'
EMAIL_USE_TLS = False

然后在发送邮件函数里使用settings里的配置
在这里插入图片描述

然后在view里面,注册成功的代码后面加上发送邮件的代码
在这里插入图片描述

在注册页面尝试一下
在这里插入图片描述

发送成功
在这里插入图片描述
贴一下此时的SendMail.py里的发送邮件的公用方法


#这个函数根据传入的code_length生成相应长度的随机字符串
import random

from django.core.mail import send_mail

from Django_mock.settings import EMAIL_FROM
from Users.models import EmailVerify


def random_str(code_length):
    chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
    return ''.join(random.sample(chars,code_length))


#发送邮件的通用方法
def send_cus_mail(email,type):
    code = random_str(6)
    email_verify = EmailVerify()
    email_verify.code = code
    email_verify.email = email
    email_verify.send_type = type
    email_verify.save()

    email_title = ''
    email_body = ''

    if type == 'register':
        email_title = '在线激活'
        email_body = '点击链接激活:http://127.0.0.1:8000/active/{}'.format(code)
        #send_mail是python内置的一个函数
        send_mail(email_title,email_body,EMAIL_FROM,[email])



if __name__ == '__main__':
    print(random_str(6))

发送邮件成功后
在view定义一个CBV,这边除了request外还多传了一个参数active_code,这种写法在最初学习Django url跳转的时候遇到过
在这里插入图片描述

接下来在url里写个path,保证发送到邮箱的链接有效可点击,用repath正则表达式re_path('active/(?P<active_code>.*/$)',ActiveView.as_view(),name = 'active')

在这里插入图片描述

然后到邮箱里点击发送过来的链接,可以成功访问

二.激活的准备工作

接下来的思路应该是根据点击链接获取到授权码
根据获取到的授权码到相应的表单中找到对应的邮箱,如下:
在这里插入图片描述

然后根据邮箱找到对应的用户,把这条用户记录的相应字段改为已认证
在这里插入图片描述
is_active默认是1,我们在注册成功,创建新用户的时候把这个字段指定为0
在这里插入图片描述

三.实现激活

当点击发送给邮箱的链接之后执行如下代码
在这里插入图片描述
在这里插入图片描述

代码执行成功,相应的邮箱那里的is_active变成了1
在这里插入图片描述

激活部分代码

class ActiveView(View):
    def get(self,request,active_code):
        # 根据active_code获取到对应的邮箱
        get_email = EmailVerify.objects.get(code = active_code[:-1])

        change_active = UsersModel.objects.get(email=get_email.email)
        change_active.is_active = 1
        change_active.save()
        return render(request,'login.html',{})

四.应用激活字段

如果已激活,允许登录,否则不允许登录,加两行判断即可实现
在这里插入图片描述

在这里插入图片描述

五.注册的唯一性

如果有两个不同的用户使用了相同的邮箱,那么在激活的时候就有可能出现问题,所以要在注册的时候保证邮箱未被使用过
在这里插入图片描述

在这里插入图片描述

六.注册失败,把原输入信息回填

如果输入的验证码错误,那么所有的输入框都被清空了,还要从头再输,这样太烦了
在注册页面的邮箱输入框加入这行代码{% if register_form.email.value %}value="{{ register_form.email.value }}" {% endif %}
在这里插入图片描述
那么验证码输入失败后会将原来的邮箱填回邮箱输入框,不用再重新输入了
这是以注册为例。其他地方需要回填信息也是一样的。

到这里mock系统的登录注册就写完了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LSQ的测试日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值