Django发送邮件和itsdangerous模块的配合使用解析


Posted in Python onAugust 10, 2019

项目需求:用户注册页面注册之后,系统会发送一封邮件到用户邮箱,用户点击链接以激活账户,其中链接中的用户信息需要加密处理一下

其中激活自己邮箱的smtp服务的操作就不在加以说明,菜鸟教程上有非常清晰的讲解,也可以去网上搜索详细步骤

首先在Django项目的settings文件中配置发送邮件相关的配置如下:

# 固定写法
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# smtp服务器地址
EMAIL_HOST = 'smtp.qq.com'
# 固定端口号
EMAIL_PORT = 25
#发送邮件的邮箱
EMAIL_HOST_USER = '2746565701@qq.com'
#在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD = 'ytnvwapcbxmcdfig'
#收件人看到的发件人,尖括号中的必须与上面的user一致
EMAIL_FROM = '天天生鲜<2746565701@qq.com>'

用户模块的views.py文件关于itsdangerous和邮件发送的代码如下,项目其它部分的操作代码这里全部删除,这里使用的是基于类的视图:

基本逻辑:

  • 利用itsdangerous模块对链接中的用户信息加密,生成加密后的用户信息token;
  • 调用Django发送邮件的相关方法,进行发送邮件(邮件的配置已经配置好);
  • 邮件发送的链接中有一个可变参数,包含着用户id加密后的信息;
  • 用户接收到邮件之后,点击链接,跳转到对应的视图类进行处理;
  • 负责激活的视图类,解密用户的信息,获取用户id,查询到对应用户(在这个过程会判断被加密的信息是否超时);
  • 将对应用户中数据库中用户表中 is_active 字段的值改为1,表示此用户被激活;
  • 跳转到首页;
# 导入itsdangerous中要用到的加密类
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
# 导入itsdangerous中超时的异常
from itsdangerous import SignatureExpired
# 导入配置文件
from django.conf import settings
# 导入Django中的发送邮件的方法
from django.core.mail import send_mail
from .models import User



# Create your views here.
class RegisterView(View):
  """注册"""
  ....................
   
  def post(self, request):
    """进行注册处理"""  

    # 发送激活邮件,包含一个激活的链接:https://127.0.0.1:8000/user/active/3
    # 激活链接中需要包含用户的身份信息,并且要把身份信息进行加密

    # 加密用户的身份信息,生成激活的token
    serializer = Serializer(settings.SECRET_KEY, 3600) # 创建爱一个itsdangerous模块中加密类的对象,其中SECRET_KEY用settings中的,第二个参数为超时时间
    info = {'confirm': user.id} # 被加密的信息,一个字典,字典值为接收邮件用户的id
    # 利用dumps方法进行加密,加密后为bytes数据
    token = serializer.dumps(info) # bytes数据
    token = token.decode() # bytes转str
    # 发邮件
    subject = '天天生鲜欢迎信息' # 邮件主题
    message = '' 邮件信息,因为有html__message了,所以这里为空就好
    sender = settings.EMAIL_FROM # 发送者,直接从配置文件中导入上面配置的发送者
    receiver = [email] # 接收者的邮箱,是一个列表,这里是前端用户注册时传过来的 email
    # html结构的信息,其中包含了加密后的用户信息token
    html_message = '<h1>{},欢迎您成为天天生鲜注册会员</h1>请点击下面链接激活您的用户<br><a href="http:127.0.0.1:8000/user/active/{}" rel="external nofollow" >http:127.0.0.1:8000/user/active/{}</a>'.format(username, token, token)
    # 调用Django发送邮件的方法,这里传了5个参数
    send_mail(subject, message, sender, receiver, html_message=html_message)
    # 返回应答:跳转到首页
    return redirect(reverse('goods:index'))


class ActiveView(View):
  """用户激活"""
  def get(self, request, token):
    """进行用户激活"""
    # 进行解密,获取要激活的用户信息
    serializer = Serializer(settings.SECRET_KEY, 3600)
    try:
    # 通过itsdangerous模块的loads方法解密
      info = serializer.loads(token)
      # 获取待激活用户的id
      user_id = info.get('confirm')
      # 根据id获取用户信息
      user = User.objects.get(id=user_id)
      # 激活用户操作,将数据库中对应用户的is_active参数变为1
      user.is_active = 1
      user.save()
      # 跳转到登录界面
      return redirect(reverse('user:login'))
    except SignatureExpired as e:
      # 激活链接已经过期
      return HttpResponse('激活链接已过期!')

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python爬虫爬验证码实现功能详解
Apr 14 Python
Flask框架的学习指南之用户登录管理
Nov 20 Python
Python 遍历子文件和所有子文件夹的代码实例
Dec 21 Python
Python排序搜索基本算法之插入排序实例分析
Dec 11 Python
django 开发忘记密码通过邮箱找回功能示例
Apr 17 Python
浅谈Django中的数据库模型类-models.py(一对一的关系)
May 30 Python
python hash每次调用结果不同的原因
Nov 21 Python
Python内置方法实现字符串的秘钥加解密(推荐)
Dec 09 Python
TensorFlow MNIST手写数据集的实现方法
Feb 05 Python
Python基于read(size)方法读取超大文件
Mar 12 Python
python matplotlib imshow热图坐标替换/映射实例
Mar 14 Python
Python爬虫入门教程02之笔趣阁小说爬取
Jan 24 Python
python requests库爬取豆瓣电视剧数据并保存到本地详解
Aug 10 #Python
python实现邮件发送功能
Aug 10 #Python
Python字典推导式将cookie字符串转化为字典解析
Aug 10 #Python
python selenium登录豆瓣网过程解析
Aug 10 #Python
python matplotlib库绘制散点图例题解析
Aug 10 #Python
python matplotlib库绘制条形图练习题
Aug 10 #Python
Python OpenCV实现鼠标画框效果
Aug 19 #Python
You might like
在PWS上安装PHP4.0正式版
2006/10/09 PHP
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
2014/07/19 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
CI框架的安全性分析
2016/05/18 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
2016/10/08 PHP
浅谈PHP中的错误处理和异常处理
2017/02/04 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
2017/08/10 PHP
使用laravel的migrate创建数据表的方法
2019/09/30 PHP
jQuery 选择表格(table)里的行和列及改变简单样式
2012/12/15 Javascript
javascript 星级评分效果(手写)
2012/12/24 Javascript
jquery实现侧边弹出的垂直导航
2014/12/09 Javascript
js判断是否按下了Shift键的方法
2015/01/27 Javascript
JavaScript动态修改网页元素内容的方法
2015/03/21 Javascript
jQuery实现连续动画效果实例分析
2015/10/09 Javascript
javascript实现标签切换代码示例
2016/05/22 Javascript
第一次接触Bootstrap框架
2016/10/24 Javascript
详解vue2.0 transition 多个元素嵌套使用过渡
2017/06/19 Javascript
jQuery实现高级检索功能
2019/05/28 jQuery
JS实现百度搜索框关键字推荐
2020/02/17 Javascript
JavaScript判断数据类型有几种方法及区别介绍
2020/09/02 Javascript
Python使用htpasswd实现基本认证授权的例子
2014/06/10 Python
Python XML RPC服务器端和客户端实例
2014/11/22 Python
Python中的ceil()方法使用教程
2015/05/14 Python
理解生产者消费者模型及在Python编程中的运用实例
2016/06/26 Python
Python中使用platform模块获取系统信息的用法教程
2016/07/08 Python
python判断所输入的任意一个正整数是否为素数的两种方法
2019/06/27 Python
Python如何筛选序列中的元素的方法实现
2019/07/15 Python
CSS 3.0 结合video视频实现的创意开幕效果
2020/06/01 HTML / CSS
沃尔玛旗下墨西哥超市:Bodega Aurrera
2020/11/13 全球购物
武汉世纪畅想数字传播有限公司.NET笔试题
2014/07/22 面试题
《伯牙绝弦》教学反思
2014/03/02 职场文书
求职者怎样写自荐信
2014/04/13 职场文书
8和9的加减法教学反思
2014/05/01 职场文书
三提三创主题教育活动查摆整改措施
2014/10/25 职场文书
小组口号霸气押韵
2015/12/24 职场文书
Python实现随机生成迷宫并自动寻路
2021/06/13 Python