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

作者:springionic 时间:2023-09-11 04:29:00 

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

其中激活自己邮箱的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('激活链接已过期!')

来源:https://www.cnblogs.com/springionic/p/10926778.html

标签:django,发送,邮件,itsdangerous,模块
0
投稿

猜你喜欢

  • python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法

    2023-05-17 00:32:46
  • Python可视化神器pyecharts绘制雷达图

    2021-09-30 14:50:48
  • Python实现爬虫抓取与读写、追加到excel文件操作示例

    2023-11-10 09:08:34
  • MySQL命令行导出与导入数据库

    2024-01-14 03:30:14
  • Python实现将数据库一键导出为Excel表格的实例

    2024-01-19 19:47:27
  • 基于MATLAB和Python实现MFCC特征参数提取

    2023-01-29 07:37:53
  • 浅谈Scrapy框架普通反爬虫机制的应对策略

    2023-07-14 17:11:40
  • 微信小程序实现列表下拉刷新上拉加载

    2024-05-21 10:11:26
  • Python学习笔记之Zip和Enumerate用法实例分析

    2021-09-03 19:58:50
  • javascript FAQ函数(提问+回复)

    2024-04-19 09:55:54
  • Scrapy爬虫文件批量运行的实现

    2022-04-25 18:29:57
  • python使用正则表达式检测密码强度源码分享

    2022-06-26 15:54:42
  • 用js实现用户输入密码的强度

    2007-11-22 21:41:00
  • django中只使用ModleForm的表单验证

    2021-02-03 15:41:50
  • Mysql主从延时图解方法

    2024-01-24 04:26:29
  • python变量命名的7条建议

    2021-05-15 20:16:07
  • python随机生成大小写字母数字混合密码(仅20行代码)

    2021-04-03 23:28:47
  • Python中的函数参数类型检查

    2023-10-15 20:41:05
  • Requests库实现数据抓取与处理功能

    2021-09-24 01:44:09
  • python networkx 包绘制复杂网络关系图的实现

    2021-03-27 06:11:39
  • asp之家 网络编程 m.aspxhome.com