Django发送邮件和itsdangerous模块的配合使用
项目需求:用户注册页面注册之后,系统会发送一封邮件到用户邮箱,用户点击链接以激活账户,其中链接中的用户信息需要加密处理一下
其中激活自己邮箱的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/{}">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发送邮件和itsdangerous模块的配合使用的更多相关文章
- $Django 发送邮件--django封装模块和python内置SMTP模块
一 使用SMTP模块发送邮件 import smtplib from email.mime.text import MIMEText from email.header import Header m ...
- Django中用户权限模块
Django中用户权限模块 1 auth模块 auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理. auth可以和admin模块配合使用, 快速建立网站的管理系 ...
- Django 发送邮件
问题: 对于一些错误信息或用户注册账号的时候,需要给用户发送邮件进行验证. 以用户注册发邮件为例子,用户向后端提起注册,后端收到用户邮箱,对邮箱格式进行验证,然后发送邮件,邮件内容中包括邮件标题.邮件 ...
- Django——发送邮件
Django--发送邮件 在web应用中,服务器对客户发送邮件来通知用户一些信息,可以使用邮件来实现. Django中提供了邮件接口,使我们可以快捷的建设一个邮件发送系统. 以下是一个简单实例: se ...
- Django之第三方登陆模块
Django之第三方登陆模块 前期准备 安装 django-allauth pip install django-allauth 注意,django-allauth 需要在 Django1.10以上版 ...
- 第三百零九节,Django框架,models.py模块,数据库操作——F和Q()运算符:|或者、&并且——queryset对象序列化
第三百零九节,Django框架,models.py模块,数据库操作——F()和Q()运算符:|或者.&并且 F()可以将数据库里的数字类型的数据,转换为可以数字类型 首先要导入 from dj ...
- 第三百零八节,Django框架,models.py模块,数据库操作——链表结构,一对多、一对一、多对多
第三百零八节,Django框架,models.py模块,数据库操作——链表结构,一对多.一对一.多对多 链表操作 链表,就是一张表的外键字段,连接另外一张表的主键字段 一对多 models.Forei ...
- 第三百零七节,Django框架,models.py模块,数据库操作——表类容的增删改查
Django框架,models.py模块,数据库操作——表类容的增删改查 增加数据 create()方法,增加数据 save()方法,写入数据 第一种方式 表类名称(字段=值) 需要save()方法, ...
- 第三百零六节,Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置
Django框架,models.py模块,数据库操作——创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, ...
随机推荐
- Spring——顾问封装通知
通知(advice)是Spring中的一种比较简单的切面,只能将切面织入到目标类的所有方法中,而无法对指定方法进行增强 顾问(advisor)是Spring提供的另外一种切面,可以织入到指定的方法中 ...
- Minimal Labels
Minimal Labels 这个题需要用到拓扑排序的思维,但是这个题还有一个条件--字典序最小,因此可以用一个递增的优先队列来维护,每找到一个入度为 0 的点就把它 push 进去因而每一次判断的点 ...
- js一维数组转换为二维数组
function arrTrans(num, arr) { // 一维数组转换为二维数组 const iconsArr = []; // 声明数组 arr.forEach((item, index) ...
- BZOJ3033太鼓达人
第一问,1<<k,谁都看得出来. 毫无思路,暴搜,枚举每一个数列,Hash加map判断是否重复,拿到30,打表都打不出来. #include <iostream> #inclu ...
- flask 第八篇 实例化flask时的参数配置
Flask 是一个非常灵活且短小精干的web框架 , 那么灵活性从什么地方体现呢? 有一个神奇的东西叫 Flask配置 , 这个东西怎么用呢? 它能给我们带来怎么样的方便呢? 首先展示一下: from ...
- LeetCode 105. 从前序与中序遍历序列构造二叉树(Construct Binary Tree from Preorder and Inorder Traversal)
题目描述 根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9, ...
- SpringSecurity remember-me功能
1./login .and().formLogin().loginPage("/user/login.html") //在successHandler中,使用response返回登 ...
- Go 指针声明后赋值,出现 panic: runtime error: invalid memory address or nil pointer dereference
指针基础知识package main import "fmt" func main() { var p *int p = new(int) *p = 1 fmt.Println(p ...
- synchronized三种使用方式,及锁的类型验证
Synchronized常用三种使用方式 1.修饰普通方法:锁对象即为当前对象 2.修饰静态方法:锁对象为当前Class对象 3.修饰代码块:锁对象为synchronized紧接着的小括号内的对象 一 ...
- SolrCloud配置
一.简介 Apache Solr是基于Lucene的全文搜索引擎.如何让Solr具有容错性和高可用性,SolrCloud可以帮助我们搭建集群,提供分布式索引,以及自动备份.SolrCloud是Solr ...