利用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技能之数据导出excel的实例代码
Aug 11 Python
python的re正则表达式实例代码
Jan 24 Python
Python读取本地文件并解析网页元素的方法
May 21 Python
python中ASCII码字符与int之间的转换方法
Jul 09 Python
解决PyCharm控制台输出乱码的问题
Jan 16 Python
Python实现的文轩网爬虫完整示例
May 16 Python
python儿童学游戏编程知识点总结
Jun 03 Python
python传到前端的数据,双引号被转义的问题
Apr 03 Python
python百行代码自制电脑端网速悬浮窗的实现
May 12 Python
解决echarts中饼图标签重叠的问题
May 16 Python
python 实现两个npy档案合并
Jul 01 Python
关于Python3爬虫利器Appium的安装步骤
Jul 29 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 Socket技术
2013/08/02 PHP
采用ThinkPHP中F方法实现快速缓存实例
2014/06/13 PHP
js 页面输出值
2008/11/30 Javascript
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
javascript读写XML实现广告轮换(兼容IE、FF)
2013/08/09 Javascript
jQuery拖拽 &amp; 弹出层 介绍与示例
2013/12/27 Javascript
jQuery如何使用自动触发事件trigger
2015/11/29 Javascript
AngularJS中的$watch(),$digest()和$apply()区分
2016/04/04 Javascript
Node.js的特点详解
2017/02/03 Javascript
vue 2.0组件与v-model详解
2017/03/27 Javascript
angular2系列之路由转场动画的示例代码
2017/11/09 Javascript
Vue封装一个简单轻量的上传文件组件的示例
2018/03/21 Javascript
Vue加载组件、动态加载组件的几种方式
2018/08/31 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
JavaScript怎样在删除前添加确认弹出框?
2019/05/27 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
Python使用matplotlib绘制动画的方法
2015/05/20 Python
pymssql数据库操作MSSQL2005实例分析
2015/05/25 Python
详解python中asyncio模块
2018/03/03 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
浅谈DataFrame和SparkSql取值误区
2018/06/09 Python
python3+PyQt5 数据库编程--增删改实例
2019/06/17 Python
Python split() 函数拆分字符串将字符串转化为列的方法
2019/07/16 Python
python读取大文件越来越慢的原因与解决
2019/08/08 Python
Python实现密码薄文件读写操作
2019/12/16 Python
瑞典网上购买现代和复古家具:Reforma
2019/10/21 全球购物
深圳茁壮笔试题
2015/05/28 面试题
大学生毕业自我鉴定范文
2013/09/19 职场文书
李开复演讲稿
2014/05/24 职场文书
2014乡镇干部对照检查材料思想汇报
2014/09/26 职场文书
违章停车检讨书
2014/10/21 职场文书
交通事故案件代理词
2015/05/23 职场文书
2015年庆祝国庆节66周年演讲稿
2015/07/30 职场文书
2016年机关单位节能宣传周活动总结
2016/04/05 职场文书
Python import模块的缓存问题解决方案
2021/06/02 Python