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实现博客文章爬虫示例
Feb 26 Python
Python中的ConfigParser模块使用详解
May 04 Python
Python将多个excel表格合并为一个表格
Feb 22 Python
推荐10款最受Python开发者欢迎的Python IDE
Sep 16 Python
python循环嵌套的多种使用方法解析
Nov 29 Python
python环境下安装opencv库的方法
Mar 05 Python
python语言的优势是什么
Jun 17 Python
如何在VSCode下使用Jupyter的教程详解
Jul 13 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
Dec 11 Python
python 通过exifread读取照片信息
Dec 24 Python
pandas:get_dummies()与pd.factorize()的用法及区别说明
May 21 Python
python套接字socket通信
Apr 01 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
php错误、异常处理机制(补充)
2012/05/07 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
经常用到的JavasScript事件的翻译
2007/04/09 Javascript
fireworks菜单生成器mm_menu.js在 IE 7.0 显示问题的解决方法
2009/10/20 Javascript
jquerymobile局部渲染的各种刷新方法小结
2014/03/05 Javascript
分享一个自己动手写的jQuery分页插件
2014/08/28 Javascript
JavaScript学习笔记之JS函数
2015/01/22 Javascript
javascript实现动态改变层大小的方法
2015/05/14 Javascript
jQuery复制表单元素附源码分享效果演示
2015/09/30 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
2017/01/05 Javascript
Bootstrap table表格简单操作
2017/02/07 Javascript
支持移动端原生js轮播图
2017/02/16 Javascript
nodejs个人博客开发第四步 数据模型
2017/04/12 NodeJs
Node学习记录之cluster模块
2017/05/31 Javascript
微信小程序全局变量改变监听的实现方法
2019/07/15 Javascript
JS实现关闭小广告特效
2021/01/29 Javascript
[40:13]Ti4 冒泡赛第二天 iG vs NEWBEE 2
2014/07/15 DOTA
使用setup.py安装python包和卸载python包的方法
2013/11/27 Python
Python的Django框架中的select_related函数对QuerySet 查询的优化
2015/04/01 Python
python 3.6.4 安装配置方法图文教程
2018/09/18 Python
Pandas GroupBy对象 索引与迭代方法
2018/11/16 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
Python3.5常见内置方法参数用法实例详解
2019/04/29 Python
利用Python复制文件的9种方法总结
2019/09/02 Python
python自动化unittest yaml使用过程解析
2020/02/03 Python
canvas三角函数模拟水波效果的示例代码
2018/07/03 HTML / CSS
Onzie官网:美国时尚瑜伽品牌
2019/08/21 全球购物
理货员的岗位职责
2013/11/23 职场文书
优秀干部获奖感言
2014/01/31 职场文书
奥利奥广告词
2014/03/20 职场文书
马云北大演讲完整版:真心话,什么才是阿里的核心竞争力?
2014/04/04 职场文书
行政申诉状范文
2015/05/20 职场文书
胡桃夹子观后感
2015/06/11 职场文书
Python中的xlrd模块使用整理
2021/06/15 Python
如何用Python搭建gRPC服务
2021/06/30 Python