一.发送包含令牌的邮件
现在很多网站都有激活流程,就是登录的时候给你绑定的邮箱发送一个网址,然后你打开自己的邮箱,点击发送过来的网址或者发送过来的令牌,从而完成激活流程。
典型的有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系统的登录注册就写完了。