利用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多线程编程(三):threading.Thread类的重要函数和方法
Apr 05 Python
Python使用QQ邮箱发送Email的方法实例
Feb 09 Python
python记录程序运行时间的三种方法
Jul 14 Python
对numpy 数组和矩阵的乘法的进一步理解
Apr 04 Python
Python打包方法Pyinstaller的使用
Oct 09 Python
Pandas读取并修改excel的示例代码
Feb 17 Python
我就是这样学习Python中的列表
Jun 02 Python
python3使用腾讯企业邮箱发送邮件的实例
Jun 28 Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
Jul 05 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
Jan 08 Python
利用pandas向一个csv文件追加写入数据的实现示例
Apr 23 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
Jul 14 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
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
ecshop 订单确认中显示省市地址信息的方法
2010/03/15 PHP
Yii CGridView用法实例详解
2016/07/12 PHP
AES加解密在php接口请求过程中的应用示例
2016/10/26 PHP
PHP 裁剪图片
2021/03/09 PHP
javascript 快速排序函数代码
2012/05/30 Javascript
一个页面放2段图片滚动代码出现冲突的问题如何解决
2012/12/21 Javascript
JavaScript的null和undefined区别示例介绍
2014/09/15 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
2015/03/04 Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
2015/11/17 Javascript
JavaScript将base64图片转换成formData并通过AJAX提交的实现方法
2016/10/24 Javascript
JavaScript标准对象_动力节点Java学院整理
2017/06/27 Javascript
基于滚动条位置判断的简单实例
2017/12/14 Javascript
关于axios如何全局注册浅析
2018/01/14 Javascript
微信小程序日期选择器实例代码
2018/07/18 Javascript
vue elementui el-form rules动态验证的实例代码详解
2019/05/23 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
2019/09/23 Javascript
简单介绍Python的Tornado框架中的协程异步实现原理
2015/04/23 Python
Python+PIL实现支付宝AR红包
2018/02/09 Python
python对象销毁实例(垃圾回收)
2020/01/16 Python
pytorch数据预处理错误的解决
2020/02/20 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
CSS3制作日历实现代码
2012/01/21 HTML / CSS
html5 Canvas画图教程(11)—使用lineTo/arc/bezierCurveTo画椭圆形
2013/01/09 HTML / CSS
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
机房搬迁方案
2014/05/01 职场文书
优秀实习生主要事迹
2014/05/29 职场文书
2014学习优秀共产党员先进事迹思想汇报
2014/09/14 职场文书
2014年租房协议书范本
2014/10/30 职场文书
2014年审计工作总结
2014/11/17 职场文书
2015年度物业公司工作总结
2015/04/27 职场文书
2016年春季运动会广播稿
2015/08/19 职场文书
php字符串倒叙
2021/04/01 PHP
python 爬取吉首大学网站成绩单
2021/06/02 Python
利用Python多线程实现图片下载器
2022/03/25 Python
JS前端轻量fabric.js系列之画布初始化
2022/08/05 Javascript