当前位置: 首页 > ds >正文

第12次07 :邮箱的验证

第1步:开启信箱SMTP服务,开启之后可以使用此邮箱给用户的邮箱发送验证邮件。

登录QQ邮箱—点击右上角“设置”—点击左下角“账号与安全”—点击左侧“安全设置”—找到“POP3/IMAP/SMTP/Exchange/CardDA服务"选项,按提示步骤开启SMTP服务,需要发送两个手机验证码。

第2步:在dev.py中设置邮件参数

# 指定邮件后端
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com'  # 邮件主机
EMAIL_PORT = 465  # 邮件端口
EMAIL_USE_SSL = True
EMAIL_HOST_USER = '316620938@qq.com'  # 授权的邮件,此外应为商城的官方邮箱
EMAIL_HOST_PASSWORD = 'wdggtnpzpaebbiea'  # 上一步邮箱授权时生成的密码,而不是邮箱的注册登录密码
EMAIL_FROM = '小鱼商城<316620938@qq.com>'  #
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

第3步:定义发送邮件的函数,在users应用下创建emails.py,并定义函数

import loggingfrom django.conf import settings
from django.core.mail import send_maillogger = logging.getLogger('django')def send_verification_email(to_email, verify_url):"""发送邮件"""subject = '小鱼商城邮箱验证'html_message = '<p>尊敬的用户您好!</p>' \'<p>感谢您使用小鱼商城。</p>' \'<p>您的邮箱为:%s 。请单击此链接验证您的邮箱:</p>' \'<p><a href="%s">%s<a></p>' % (to_email, verify_url, verify_url)try:send_mail(subject, '', settings.EMAIL_FROM, [to_email], html_message=html_message)except Exception as e:logger.error(e)

第4步:在EmailView中补充发送验证邮箱的功能

class EmailView(LoginRequiredJSONMixin, View):"""添加邮箱"""def put(self, request):"""实现添加邮箱逻辑"""# 接收参数 body, 类型是bytes类型json_str = request.body.decode()json_dict = json.loads(json_str)email = json_dict.get('email')# print(email)if not email:  # 校验参数return HttpResponseForbidden('缺少email参数')if not re.match(r'^[a-z0-9][\w\\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email):return HttpResponseForbidden('参数email有误')# 赋值email字段try:request.user.email = emailrequest.user.save()except Exception as e:logger.error(e)return JsonResponse({'code': RETCODE.DBERR, 'errmsg': '添加邮箱失败'})# 补充验证邮箱的功能verify_url = '邮箱验证链接'send_verification_email(to_email=email, verify_url=verify_url)# 响应添加邮箱结果return JsonResponse({'code': RETCODE.OK, 'errmsg': '添加邮箱成功'})

第5步:安装用户信息序列化的库

pip install itsdangerous==1.1.0

第6步:定义验证邮箱的链接部分的固定串和有效期,在dev.py中

# 邮箱验证链接的固定字符串
EMAIL_VERIFY_URL = 'http://127.0.0.1:8000/emails/verification/'
# 邮箱验证链接的有效期,24小时
VERIFY_EMAIL_TOKEN_EXPIRES = 60 * 60 * 24

第7步:在users应用下utils.py中定义生成邮箱验证url的函数和反序列化的函数。

from itsdangerous import TimedJSONWebSignatureSerializer as Serializer, BadDatadef check_verify_email_token(token):"""反序列化token:param token:序列化后的token:return:user"""serializer = Serializer(settings.SECRET_KEY, expires_in=constants.VERIFY_EMAIL_TOKEN_EXPIRES)try:data = serializer.loads(token)except BadData:return Noneelse:user_id = data.get('user_id')email = data.get('email')try:user = User.objects.get(id=user_id, email=email)except User.DoesNotExist:return Noneelse:return userdef generate_verify_email_url(user):"""生成邮箱验证url"""serializer = Serializer(settings.SECRET_KEY, expires_in=constants.VERIFY_EMAIL_TOKEN_EXPIRES)data = {'user_id': user.id, 'email': user.email}token = serializer.dumps(data).decode()verify_url = settings.EMAIL_VERIFY_URL + '?token=' + tokenreturn verify_url

在users应用下创建constants.py,用于定义常量

# 邮件验证链接有效期:一天
VERIFY_EMAIL_TOKEN_EXPIRES = 60 * 60 * 24# 用户地址上限
USER_ADDRESS_COUNTS_LIMIT = 20
# 显示我的订单数量
ORDERS_LIST_LIMIT = 5

第8步:在users应用views.py中使用generate_verify_email_url()函数,将原来的字符串换在函数

# verify_url = '邮箱验证链接'
verify_url = generate_verify_email_url(request.user)

第9步:views.py中定义验证邮箱的类视图

class VerifyEmailView(View):"""验证邮箱"""def get(self, request):# 从请求中取到tokentoken = request.GET.get('token')if not token:return HttpResponseForbidden('缺少token')user = check_verify_email_token(token)  # 从token中提取信息try:user.email_active = Trueuser.save()except Exception as e:logger.error(e)return HttpResponseForbidden('邮箱验证失败')return redirect(reverse('users:info'))

第10步:定义路由

path('emails/verification/', views.VerifyEmailView.as_view()),

http://www.xdnf.cn/news/9227.html

相关文章:

  • 57、【OS】【Nuttx】编码规范解读(五)
  • ET CircularBuffer 类
  • Cadence学习笔记之---PCB过孔替换、封装更新,DRC检查和状态查看
  • 动态贴纸的实时渲染原理:美颜SDK中的特效引擎开发实录
  • 化工厂电动机保护升级记:当Profinet遇上DeviceNet
  • 【数字图像处理】_笔记
  • Webpack 5 模块联邦(Module Federation)详解与实战
  • 多头注意力 vs 单头注意力:计算量与参数量区别
  • MySQL日志文件有哪些?
  • 一、docker安装以及配置加速
  • [免费]SpringBoot+Vue在线教育(在线学习)系统(高级版)【论文+源码+SQL脚本】
  • Python打卡训练营Day37
  • 《仿盒马》app开发技术分享-- 新增地址(端云一体)
  • AI算力网络光模块市场发展分析
  • 第二章 1.1 数据采集安全风险概述
  • 程序编码规范,软件设计规范
  • 【产品经理】产品经理知识体系
  • Mysql性能优化方案
  • 洛谷题目:P2785 物理1(phsic1)- 磁通量 题解 (本题较难)
  • Arduino+LCD1602,并口版 LCD1602和IIC版LCD1602
  • w~自动驾驶~合集2~激光毫米波雷达
  • 深入解构 Chromium 升级流程与常见问题解决方案
  • 从实验室到工业的“加速器”:单原子催化技术的突破与应用
  • 兰亭妙微 | 图标设计公司 | UI设计案例复盘
  • 机器学习中的 K-均值聚类算法及其优缺点
  • 快速上手SHELL脚本基础及变量与运算
  • 一文带你彻底理清C 语言核心知识 与 面试高频考点:从栈溢出到指针 全面解析 附带笔者手写2.4k行代码加注释
  • UE C++学习笔记之按键绑定
  • 使用Dockerfile创建镜像
  • AI时代新词-人工智能生成内容(AIGC)