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中要用到的加密类 fromitsdangerousimportTimedJSONWebSignatureSerializerasSerializer #导入itsdangerous中超时的异常 fromitsdangerousimportSignatureExpired #导入配置文件 fromdjango.confimportsettings #导入Django中的发送邮件的方法 fromdjango.core.mailimportsend_mail from.modelsimportUser #Createyourviewshere. classRegisterView(View): """注册""" .................... defpost(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='{},欢迎您成为天天生鲜注册会员
请点击下面链接激活您的用户http:127.0.0.1:8000/user/active/{}'.format(username,token,token) #调用Django发送邮件的方法,这里传了5个参数 send_mail(subject,message,sender,receiver,html_message=html_message) #返回应答:跳转到首页 returnredirect(reverse('goods:index')) classActiveView(View): """用户激活""" defget(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() #跳转到登录界面 returnredirect(reverse('user:login')) exceptSignatureExpiredase: #激活链接已经过期 returnHttpResponse('激活链接已过期!')
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。