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 26 Python
wxPython中listbox用法实例详解
Jun 01 Python
Django框架下在URLconf中指定视图缓存的方法
Jul 23 Python
python杀死一个线程的方法
Sep 06 Python
Python编程实现及时获取新邮件的方法示例
Aug 10 Python
Python配置mysql的教程(推荐)
Oct 13 Python
python实现批量解析邮件并下载附件
Jun 19 Python
python获取引用对象的个数方式
Dec 20 Python
Python获取、格式化当前时间日期的方法
Feb 10 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
Feb 25 Python
vscode调试django项目的方法
Aug 06 Python
python实现企业微信定时发送文本消息的示例代码
Nov 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
PHP在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
2011/08/03 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
javascript设计模式 封装和信息隐藏(上)
2012/07/24 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
2014/05/29 Javascript
javascript中Date对象的getDay方法使用指南
2014/12/22 Javascript
js在指定位置增加节点函数insertBefore()用法实例
2015/01/12 Javascript
基于jQuery+JSON的省市二三级联动效果
2015/06/05 Javascript
详解JavaScript基于面向对象之创建对象(1)
2015/12/10 Javascript
SpringMVC返回json数据的三种方式
2015/12/10 Javascript
CSS3 3D 技术手把手教你玩转
2016/09/02 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
jquery hover 不停闪动问题的解决方法(亦为stop()的使用)
2017/02/10 Javascript
用jQuery实现圆点图片轮播效果
2017/03/19 Javascript
jquery获取元素到屏幕四周可视距离的方法
2018/09/05 jQuery
浅谈webpack4.x 入门(一篇足矣)
2018/09/05 Javascript
[55:25]2018DOTA2亚洲邀请赛3月29日 小组赛A组 VG VS OG
2018/03/30 DOTA
简单介绍利用TK在Python下进行GUI编程的教程
2015/04/13 Python
python调用java模块SmartXLS和jpype修改excel文件的方法
2015/04/28 Python
把pandas转换int型为str型的方法
2019/01/29 Python
Python面向对象之类的封装操作示例
2019/06/08 Python
python中Lambda表达式详解
2019/11/20 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
经验丰富程序员才知道的8种高级Python技巧
2020/07/27 Python
python实现批处理文件
2020/07/28 Python
免费获得微软MCSD证书赶快行动吧!
2012/11/13 HTML / CSS
带你认识HTML5中的WebSocket
2015/05/22 HTML / CSS
意大利婴儿产品网上商店:Mukako
2018/10/14 全球购物
Fanatics英国官网:美国体育电商
2018/11/06 全球购物
Dr. Martens马汀博士澳大利亚官网:马丁靴鼻祖
2019/07/02 全球购物
新护士岗前培训制度
2014/02/02 职场文书
校运动会广播稿300字
2014/10/07 职场文书
2015年工会工作总结
2015/03/30 职场文书
中学教师师德师风承诺书
2015/04/28 职场文书
2015年征兵工作总结
2015/07/23 职场文书
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
2022/01/18 PostgreSQL