侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

框架(架构)  /  管理员 发布于 7年前   363

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

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

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

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

用户模块的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_mailfrom .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="https:/article/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('激活链接已过期!')

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


  • 上一条:
    Django在admin后台集成TinyMCE富文本编辑器的例子
    下一条:
    nginx黑名单和django限速,最简单的防恶意请求方法分享
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Filament v3.1版本发布(0个评论)
    • docker + gitea搭建一个git服务器流程步骤(0个评论)
    • websocket的三种架构方式使用优缺点浅析(0个评论)
    • ubuntu20.4系统中宿主机安装nginx服务,docker容器中安装php8.2实现运行laravel10框架网站(0个评论)
    • phpstudy_pro(小皮面板)中安装最新php8.2.9版本流程步骤(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2018-05
    • 2020-02
    • 2020-03
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-11
    • 2021-03
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-08
    • 2023-08
    • 2023-10
    • 2023-12
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客