利用Django内置的认证视图实现用户密码重置功能详解


Posted in Python onNovember 24, 2017

前言

密码重置功能相信对大家来说都不陌生,本文主要给大家介绍了关于使用Django内置的认证视图实现简单的通过邮箱重置密码的功能,分享出来供大家参考学习,下面话不多说了,来一起来看看详细的介绍吧。

版本: django 1.11

实现方法

在django.contrib.auth.views中提供了四个类视图用于密码重置

class PasswordResetView

URL name: password_reset  #要保持相同

通过给邮箱发送重置密码的链接进行密码重置.注意如果邮箱不存在,不会发送邮件但也不会有错误提示!

属性:

  • template_name:指定重置密码页面的模板名称(输入邮箱页面),默认为'registration/password_reset_form.html'
  • form_class:指定对邮箱进行验证的Form,默认为'PasswordResetForm',如果要实现'邮箱未注册'的提示,可以重写该Form的clean()方法.
  • email_template_name:邮件内容的模板,默认为'registration/password_reset_email.html'.
  • subject_template_name:邮件主题的模板,默认'registration/password_reset_subject.txt'.
  • success_url:邮件发送成功(或邮箱未注册)后重定向的URL.
  • form_email: 发送邮件的地址.默认使用DEFAULT_FORM_EMAIL.需要在settings.py文件中进行邮箱参数的配置.
  • extra_context: 需要添加到模板中的额外上下文数据.

对PasswordResetView进行简单定制:

form django.contrib.auth.views import PasswordRestView
from django.contrib.auth.forms import PasswordRestForm
from django.contrib.auth.models import User
from django import forms

class CustomPasswordResetForm(PasswordRestForm):
 #实现'邮箱未注册'的提示
 class clean_email(self):
 email = self.cleaned_date.get('email', '')
 if not User.objects.filter(email=email):
  raise forms.ValidationError('邮箱未注册')
 return email

class CustomPasswordResetView(PasswordRestView):
 template_name = 'your_passd_reset.html'
 form_class = CustomPasswordResetForm


#urls.py
from myapp import views

urlpatterns = [
 # 除非重写了各视图的模板,否则name需要和指定的URL name一致
 url(r'^password_reset/$', views.CustomPasswordResetView.as_view(), name='password_reset'),
]

class PasswordResetDoneView

URL name: password_reset_done

显示邮件成功发送的页面.该视图默认由PasswordResetView的success_url参数来调用.

注意:如果邮箱未注册,用户的is_active为False或者有不可用密码,仍然会重定向到该页面,但是不会发送邮件!

属性:

  • template_name:指定模板文件,默认'registration/password_reset_done.html'
  • extra_context: 添加额外的上下文数据

class PasswordResetConfirmView

URL name: password_reset_confirm

显示一个含有输入新密码的表单的页面

属性:

  • template_name:指定模板文件,默认'registration/password_reset_confirm.html'
  • post_reset_login: 一个布尔值,指定密码重置成功后是否自动登录,默认为False.
  • post_reset_login_backend:当你重写了authentication_backend,并且设置post_reset_login为True,需要指定所使用的authentication_backend
  • form_class: 用于验证密码的Form,默认为SetPasswordForm.
  • success_url: 密码重置后重定向的url,默认'password_reset_complete'.
  • extra_context: 额外的上下文

class PasswordResetCompleteView

URL name:password_reset_complete

显示一个视图,通知用户密码已重置成功

属性:

  • template_name: 指定模板文件,默认'registration/password_reset_complete.html'
  • extra_context: 额外的上下文

下面这三个视图的重写方法与PasswordResetView相同.

如果完全使用默认提供的功能和模板,可以直接在urls.py文件中引入

from django.conf.urls import url, include
from django.contrib.auth import views as auth_views

urlpatterns = [
 url(r'^login/$', auth_views.LoginView.as_view(), name='login'),
 url(r'^logout/$', auth_views.logout_then_login, name='logout'), #注销后重定向到登录界面
 url(r'^password_reset/$', auth_views.PasswordResetView.as_view(form_class=forms.CustomPasswordResetForm), name='password_reset'), #密码重置链接
 url(r'^password_reset/done/$', auth_views.PasswordResetDoneView.as_view(), name='password_reset_done'), #密码重置邮件发送完成后的页面
 url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'), #用户通过邮箱打开的重置密码页面
 url(r'^reset/done/$', auth_views.PasswordResetCompleteView.as_view(), name='password_reset_complete'), #密码重置完成后跳转的页面
]

参考:https://docs.djangoproject.com/en/1.11/topics/auth/default/#module-django.contrib.auth.views

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。   

Python 相关文章推荐
python用来获得图片exif信息的库实例分析
Mar 16 Python
Python functools模块学习总结
May 09 Python
Python多线程和队列操作实例
Jun 21 Python
基于python的Tkinter编写登陆注册界面
Jun 30 Python
python kmeans聚类简单介绍和实现代码
Feb 23 Python
Python3 利用face_recognition实现人脸识别的方法
Mar 13 Python
Python restful框架接口开发实现
Apr 13 Python
详解Python中import机制
Sep 11 Python
简述python四种分词工具,盘点哪个更好用?
Apr 13 Python
python爬虫之利用selenium模块自动登录CSDN
Apr 22 Python
pytorch 如何使用batch训练lstm网络
May 28 Python
教你怎么用PyCharm为同一服务器配置多个python解释器
May 31 Python
利用python3随机生成中文字符的实现方法
Nov 24 #Python
Python内置函数 next的具体使用方法
Nov 24 #Python
python中WSGI是什么,Python应用WSGI详解
Nov 24 #Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
Nov 24 #Python
Python内置函数——__import__ 的使用方法
Nov 24 #Python
Django中login_required装饰器的深入介绍
Nov 24 #Python
Python多进程库multiprocessing中进程池Pool类的使用详解
Nov 24 #Python
You might like
PHP 数字左侧自动补0
2008/03/31 PHP
Google Voice 短信发送接口PHP开源版(2010.5更新)
2010/07/22 PHP
php实现单链表的实例代码
2013/03/22 PHP
PHP容易忘记的知识点分享
2013/04/30 PHP
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
2013/06/01 PHP
解析php中获取系统信息的方法
2013/06/25 PHP
PHP远程调试之XDEBUG
2015/12/29 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
JQuery 解析多维的Json数据格式
2009/11/02 Javascript
JQuery Tips(4) 一些关于提高JQuery性能的Tips
2009/12/19 Javascript
js中typeof的用法汇总
2013/12/12 Javascript
Java Mybatis框架入门基础教程
2015/09/21 Javascript
Angularjs中UI Router全攻略
2016/01/29 Javascript
String字符串截取的四种方式总结
2016/11/28 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
2017/01/03 Javascript
微信小程序 常用工具类详解及实例
2017/02/15 Javascript
jQuery实现QQ空间汉字转拼音功能示例
2017/07/10 jQuery
在Vue中使用echarts的实例代码(3种图)
2017/07/10 Javascript
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
详解ES6数组方法find()、findIndex()的总结
2020/05/12 Javascript
结合axios对项目中的api请求进行封装操作
2020/09/21 Javascript
[02:05]2014DOTA2国际邀请赛 BBC外卡赛赛后总结
2014/07/09 DOTA
python的三目运算符和not in运算符使用示例
2014/03/03 Python
浅谈Pandas 排序之后索引的问题
2018/06/07 Python
Python docx库用法示例分析
2019/02/16 Python
浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器
2019/03/11 Python
Python通过yagmail实现发送邮件代码解析
2020/10/27 Python
selenium学习教程之定位以及切换frame(iframe)
2021/01/04 Python
Shell脚本如何向终端输出信息
2014/04/25 面试题
服务行业个人求职的自我评价
2013/12/12 职场文书
京剧自荐信
2014/01/26 职场文书
《都江堰》教学反思
2014/02/07 职场文书
优秀经理获奖感言
2014/03/04 职场文书
年终奖发放方案
2014/06/02 职场文书
学校个人对照检查材料
2014/08/26 职场文书
vue+spring boot实现校验码功能
2021/05/27 Vue.js