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


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

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

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

     1 # 固定写法
     2 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
     3 # smtp服务器地址
     4 EMAIL_HOST = 'smtp.qq.com'
     5 # 固定端口号
     6 EMAIL_PORT = 25
     7 #发送邮件的邮箱
     8 EMAIL_HOST_USER = '2746565701@qq.com'
     9 #在邮箱中设置的客户端授权密码
    10 EMAIL_HOST_PASSWORD = 'ytnvwapcbxmcdfig'
    11 #收件人看到的发件人,尖括号中的必须与上面的user一致
    12 EMAIL_FROM = '天天生鲜<2746565701@qq.com>'

    用户模块的views.py文件关于itsdangerous和邮件发送的代码如下,项目其它部分的操作代码这里全部删除,这里使用的是基于类的视图:

    基本逻辑:

    • 利用itsdangerous模块对链接中的用户信息加密,生成加密后的用户信息token;
    • 调用Django发送邮件的相关方法,进行发送邮件(邮件的配置已经配置好);
    • 邮件发送的链接中有一个可变参数,包含着用户id加密后的信息;
    • 用户接收到邮件之后,点击链接,跳转到对应的视图类进行处理;
    • 负责激活的视图类,解密用户的信息,获取用户id,查询到对应用户(在这个过程会判断被加密的信息是否超时);
    • 将对应用户中数据库中用户表中 is_active 字段的值改为1,表示此用户被激活;
    • 跳转到首页;
     1 # 导入itsdangerous中要用到的加密类
     2 from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
     3 # 导入itsdangerous中超时的异常
     4 from itsdangerous import SignatureExpired
     5 # 导入配置文件
     6 from django.conf import settings
     7 # 导入Django中的发送邮件的方法
     8 from django.core.mail import send_mail
     9 from .models import User
    10 
    11 
    12 
    13 # Create your views here.
    14 class RegisterView(View):
    15     """注册"""
    16     ....................
    17      
    18     def post(self, request):
    19         """进行注册处理"""   
    20 
    21         # 发送激活邮件,包含一个激活的链接:https://127.0.0.1:8000/user/active/3
    22         # 激活链接中需要包含用户的身份信息,并且要把身份信息进行加密
    23 
    24         # 加密用户的身份信息,生成激活的token
    25         serializer = Serializer(settings.SECRET_KEY, 3600)  # 创建爱一个itsdangerous模块中加密类的对象,其中SECRET_KEY用settings中的,第二个参数为超时时间
    26         info = {'confirm': user.id}  # 被加密的信息,一个字典,字典值为接收邮件用户的id
    27         # 利用dumps方法进行加密,加密后为bytes数据
    28         token = serializer.dumps(info)  # bytes数据
    29         token = token.decode()  # bytes转str
    30         # 发邮件
    31         subject = '天天生鲜欢迎信息'  # 邮件主题
    32         message = ''  邮件信息,因为有html__message了,所以这里为空就好
    33         sender = settings.EMAIL_FROM  # 发送者,直接从配置文件中导入上面配置的发送者
    34         receiver = [email]  # 接收者的邮箱,是一个列表,这里是前端用户注册时传过来的 email
    35         # html结构的信息,其中包含了加密后的用户信息token
    36         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)
    37         # 调用Django发送邮件的方法,这里传了5个参数
    38         send_mail(subject, message, sender, receiver, html_message=html_message)
    39         # 返回应答:跳转到首页
    40         return redirect(reverse('goods:index'))
    41 
    42 
    43 class ActiveView(View):
    44     """用户激活"""
    45     def get(self, request, token):
    46         """进行用户激活"""
    47         # 进行解密,获取要激活的用户信息
    48         serializer = Serializer(settings.SECRET_KEY, 3600)
    49         try:
    50         # 通过itsdangerous模块的loads方法解密
    51             info = serializer.loads(token)
    52             # 获取待激活用户的id
    53             user_id = info.get('confirm')
    54             # 根据id获取用户信息
    55             user = User.objects.get(id=user_id)
    56             # 激活用户操作,将数据库中对应用户的is_active参数变为1
    57             user.is_active = 1
    58             user.save()
    59             # 跳转到登录界面
    60             return redirect(reverse('user:login'))
    61         except SignatureExpired as e:
    62             # 激活链接已经过期
    63             return HttpResponse('激活链接已过期!')    
  • 相关阅读:
    Linux下gdb attach的使用(调试已在运行的进程)
    Linux ps 命令
    SemaphoreFullException when checking user role via ASP.NET membership
    c程序内存分布
    正则表达式
    事务实战感悟
    oracle免客户端安装 plsql连接
    关于tomcat的热部署
    json工具包比较 fastjson jackson gson
    图片 滚动 放大缩小 旋转
  • 原文地址:https://www.cnblogs.com/springionic/p/10926778.html
Copyright © 2020-2023  润新知