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

其中激活自己邮箱的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模块的配合使用的更多相关文章

  1. $Django 发送邮件--django封装模块和python内置SMTP模块

    一 使用SMTP模块发送邮件 import smtplib from email.mime.text import MIMEText from email.header import Header m ...

  2. Django中用户权限模块

    Django中用户权限模块 1 auth模块 auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理. auth可以和admin模块配合使用, 快速建立网站的管理系 ...

  3. Django 发送邮件

    问题: 对于一些错误信息或用户注册账号的时候,需要给用户发送邮件进行验证. 以用户注册发邮件为例子,用户向后端提起注册,后端收到用户邮箱,对邮箱格式进行验证,然后发送邮件,邮件内容中包括邮件标题.邮件 ...

  4. Django——发送邮件

    Django--发送邮件 在web应用中,服务器对客户发送邮件来通知用户一些信息,可以使用邮件来实现. Django中提供了邮件接口,使我们可以快捷的建设一个邮件发送系统. 以下是一个简单实例: se ...

  5. Django之第三方登陆模块

    Django之第三方登陆模块 前期准备 安装 django-allauth pip install django-allauth 注意,django-allauth 需要在 Django1.10以上版 ...

  6. 第三百零九节,Django框架,models.py模块,数据库操作——F和Q()运算符:|或者、&并且——queryset对象序列化

    第三百零九节,Django框架,models.py模块,数据库操作——F()和Q()运算符:|或者.&并且 F()可以将数据库里的数字类型的数据,转换为可以数字类型 首先要导入 from dj ...

  7. 第三百零八节,Django框架,models.py模块,数据库操作——链表结构,一对多、一对一、多对多

    第三百零八节,Django框架,models.py模块,数据库操作——链表结构,一对多.一对一.多对多 链表操作 链表,就是一张表的外键字段,连接另外一张表的主键字段 一对多 models.Forei ...

  8. 第三百零七节,Django框架,models.py模块,数据库操作——表类容的增删改查

    Django框架,models.py模块,数据库操作——表类容的增删改查 增加数据 create()方法,增加数据 save()方法,写入数据 第一种方式 表类名称(字段=值) 需要save()方法, ...

  9. 第三百零六节,Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置

    Django框架,models.py模块,数据库操作——创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, ...

随机推荐

  1. Charles中文破解版下载安装及使用教程

    下载地址:https://pan.baidu.com/s/1praYZAw23psZLi59hKJjqw 一. 简介及安装 Charles 是在 PC 端常用的网络封包截取工具,但它不仅仅能在pc端使 ...

  2. TypeScript----数据类型

    TypeScript 简介 TypeScript 由 Microsoft开发和维护的一种开源编程语言.它支持 JavaScript 的所有语法和语义,同时通过作为 ECMAScript 的超集来提供一 ...

  3. How to correctly set application badge value in iOS 8?

    o modify the badge under ios8 you have to ask for permissions let settings = UIUserNotificationSetti ...

  4. IDEA2019 JFormDesigner-6.0.6.2-intellij-idea破解版

    IDEA2019 JFormDesigner-6.0.6.2-intellij-idea破解版 下载链接:百度云 提取码:10ox 下载完后通过idea的本地磁盘安装即可

  5. android 知识体系

  6. php中应用redis

    下载软件包wget https://codeload.github.com/phpredis/phpredis/zip/develop mv develop phpredis.zip 解压unzip ...

  7. JetBrain系列学生免费授权

    1.访问网址:https://www.jetbrains.com/zh/student/ 2.往下滚动,点击立即申请 3.填写邮箱信息 4.确认后,跳转到Thank you页面,上面说已经给注册邮箱发 ...

  8. 日期格式存入字符类型之后,再转回datetime类型报错

    背景 最近我们迁移了一批服务器,因我们在azure portal 上新开的VM暂时默认只有英文系统,所以我们在开设好的数据库服务器的时候,都会重置数据库字符排序成中文,避免出现中文乱码问题,重置参考路 ...

  9. bazel编译im2txt的问题

    问题: 原本可以正常运行的程序,出现找不到tensorflow的问题.打印出来sys.version和sys.path,发现python版本并不是conda环境的版本 (tensorflow) yua ...

  10. Redis 分库

    Redis 可以分库,相当于 MySQL 中的 database.控制数据库总数在 redis配置文件中设置,默认是 16 个.数据库名称是整数索引标识,而不是由一个数据库名称字符串. 选择数据库用 ...