利用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网络编程学习笔记(六):Web客户端访问
Jun 09 Python
Python处理字符串之isspace()方法的使用
May 19 Python
Python基于有道实现英汉字典功能
Jul 25 Python
关于python pyqt5安装失败问题的解决方法
Aug 08 Python
python使用KNN算法手写体识别
Feb 01 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
Feb 11 Python
python列表list保留顺序去重的实例
Dec 14 Python
如何使用pyinstaller打包32位的exe程序
May 26 Python
在python里面运用多继承方法详解
Jul 01 Python
Python运行异常管理解决方案
Mar 09 Python
windows支持哪个版本的python
Jul 03 Python
Docker如何部署Python项目的实现详解
Oct 26 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
15种PHP Encoder的比较
2007/03/06 PHP
php实现的在线人员函数库
2008/04/09 PHP
Ajax+PHP 边学边练 之二 实例
2009/11/24 PHP
php调用dll的实例操作动画与代码分享
2012/08/14 PHP
10个超级有用的PHP代码片段果断收藏
2015/09/23 PHP
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
基于ajax实现文件上传并显示进度条
2015/08/03 Javascript
详解jQuery简单的表单应用
2016/12/16 Javascript
Javascript仿京东放大镜的效果
2017/03/01 Javascript
ES6中箭头函数的定义与调用方式详解
2017/06/02 Javascript
浅谈Angular4中常用管道
2017/09/27 Javascript
jQuery实现动态显示select下拉列表数据的方法
2018/02/05 jQuery
vuejs选中当前样式active的实例
2018/08/22 Javascript
浅谈VUE-CLI脚手架热更新太慢的原因和解决方法
2018/09/28 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
Vue+Element自定义纵向表格表头教程
2020/10/26 Javascript
nestjs返回给前端数据格式的封装实现
2021/02/22 Javascript
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
在Python的Flask框架中实现全文搜索功能
2015/04/20 Python
Python随机数random模块使用指南
2016/09/09 Python
PyCharm 常用快捷键和设置方法
2017/12/20 Python
urllib和BeautifulSoup爬取维基百科的词条简单实例
2018/01/17 Python
python爬虫之urllib3的使用示例
2018/07/09 Python
对python制作自己的数据集实例讲解
2018/12/12 Python
python实践项目之监控当前联网状态详情
2019/05/23 Python
Python实现CNN的多通道输入实例
2020/01/17 Python
CSS3哪些新特性值得称赞
2016/03/02 HTML / CSS
接口中的方法可以是abstract的吗
2015/07/23 面试题
一些Solaris面试题
2013/03/22 面试题
母亲节感恩寄语
2014/02/21 职场文书
安全大检查实施方案
2014/02/22 职场文书
保险公司早会主持词
2014/03/22 职场文书
超市七夕促销活动方案
2014/08/28 职场文书
公司员工离职证明书
2014/10/04 职场文书
2015年乡镇工会工作总结
2015/05/19 职场文书
GO语言异常处理分析 err接口及defer延迟
2022/04/14 Golang