django注册发送邮箱激活账号

在用django开发项目时,会用到注册账号发送邮箱来激活账号或接收手机验证码。

本篇博客写发送邮箱验证码,后续写发送手机验证码。

首先可以配置邮箱的一些必须的参数等
如,张三来注册 x 网站,邮箱是[email protected],那么这个邮箱会收到激活链接,那么给他发送链接的邮箱是什么,需要我们 自己配置,在全局的settings.py中

EMAIL_HOST = 'smtp.163.com'  # 163邮箱的 SMTP 地址

EMAIL_PORT = 25     # SMTP端口

EMAIL_HOST_USER = '[email protected]'       # 我自己的邮箱

EMAIL_HOST_PASSWORD = '****************'       # 我的邮箱授权码

EMAIL_SUBJECT_PREFIX = '[huamuxiong]'     # 为邮件Subject-line前缀,默认是'[django]'

EMAIL_USE_TLS = False   # 与SMTP服务器通信时,是否启动TLS链接(安全链接)。默认是false

EMAIL_FROM = '[email protected]'  # 与 EMAIL_HOST_USER 相同

授权码获取方式:
django注册发送邮箱激活账号_第1张图片
django注册发送邮箱激活账号_第2张图片
前期工作:
写验证码的models

# 邮箱--用来激活账号和找回密码
class EmailPro(models.Model):
    code = models.CharField(max_length=20, verbose_name='验证码')
    email = models.EmailField(max_length=50, verbose_name='邮箱')
    send_type = models.CharField(max_length=10, choices=(('register', '邮箱注册'), ('forget', '忘记密码')), verbose_name='发送类型')
    send_time = models.DateTimeField(auto_now_add=True, verbose_name='发送时间')

    class Meta:
        db_table='emailpro'
        verbose_name='邮箱验证码'
        verbose_name_plural=verbose_name

生成随机验证码的函数:
randomlength:生成多少位的字符串,默认是 8 位

from random import Random
# 随机生成字符串
def random_str(randomlength=8):
    str = ''
    chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
    length = len(chars)-1
    random = Random()
    for i in range(randomlength):
        str += chars[random.randint(0, length)]
    return str   # 将拼接的字符串返回

写发送邮箱的函数:

from django.core.mail import send_mail

from index.models import EmailPro
from rentingHouse.settings import EMAIL_FROM  # 项目名称为 rentingHouse

# 接收两个参数,一个邮箱,另一个是发送类型,注册或忘记密码
def send_register_email(email, send_type='register'):  # 类型为注册
    email_recode = EmailPro()
    code = random_str(16)  # 生成16位的随机字符串
    email_recode.code = code
    email_recode.email = email
    email_recode.send_type = send_type
    email_recode.save()

    email_title = ''
    email_body = ''
    if send_type == 'register':
        email_title = '注册激活链接'
        email_body = '请点击下方的链接激活你的账号:http://127.0.0.1:8000/active/{0}'.format(code)
    else:
        pass  # 忘记密码--暂时不写
    send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])  # 注释 ①
    if send_status:
        pass

注释 ①:
看一下必传的四个参数:
subject: 主题,也就是 标题 title
message:消息,也就是 内容 body
from_email:发送的邮箱 配置中的 EMAIL_FROM
recipient_list:收件人清单,要求是列表 ,[email1, email2,…],只有一个的话也是列表[email]

send_mail会返回一个结果,可对结果做简单的处理,这里不写

def send_mail(subject, message, from_email, recipient_list,
              fail_silently=False, auth_user=None, auth_password=None,
              connection=None, html_message=None):

在注册时,让 isActice 设置为False,即不激活

...  # 验证邮箱是否存在,两次密码是否一致等,直接简写了
email = request.POST.get('email', '')
password = request.POST.get('password', '')
password = make_password(password)  # 密码加密

# 将注册信息添加到数据库的user表中
obj = User(email=email, username=username, password=password, isActive=False)
obj.save()
send_register_email(email, 'register')  # 调用发送邮件的方法

注册页面,使用[email protected]邮箱注册
django注册发送邮箱激活账号_第3张图片
登陆protonmail邮箱查看一下
在这里插入图片描述
显示的是一个主题 title 和 发送者邮箱
点进去看一下
django注册发送邮箱激活账号_第4张图片
由于未搭建服务器, 所以暂时还是本地地址 127.0.0.1

在登陆时根据isActive是否为True来判断账号是否被激活,上述说到False为没激活
False —> 0

if user.isActive == 0:
    return render(request, 'login.html', {'error_msg': '账号尚未激活'})

django注册发送邮箱激活账号_第5张图片
说明:这里我暂时用的用户名username,可以设置成邮箱,或这个两者都可以登陆的那种(借助Q),这里不说了

那么在邮箱里点击链接后,需要做的就是让isActive=True

class ActiveUserView(View):
    def get(self, request, active_code):
        all_codes = EmailPro.objects.filter(code=active_code)
        if all_codes:
            for recode in all_codes:
                email = recode.email
                user = User.objects.get(email=email)
                user.isActive=True
                user.save()
            return redirect('/login/')
        else:
            return render(request, 'code_fail.html')

用到的url

url('^active/(?P.*)/$', ActiveUserView.as_view(), name='active_code'),  # 注册激活链接

至此本篇文章结束

你可能感兴趣的:(python3,Django)