利用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基于二分查找实现求整数平方根的方法
May 12 Python
Python中矩阵库Numpy基本操作详解
Nov 21 Python
Python各类图像库的图片读写方式总结(推荐)
Feb 23 Python
Python DataFrame设置/更改列表字段/元素类型的方法
Jun 09 Python
python实现输入数字的连续加减方法
Jun 22 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
Mar 20 Python
Python实现一个数组除以一个数的例子
Jul 20 Python
Django为窗体加上防机器人的验证码功能过程解析
Aug 14 Python
Flask中endpoint的理解(小结)
Dec 11 Python
Python如何避免文件同名产生覆盖
Jun 09 Python
python按照list中字典的某key去重的示例代码
Oct 13 Python
Python调用SMTP服务自动发送Email的实现步骤
Feb 07 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
第一节--面向对象编程
2006/11/16 PHP
php自动载入类用法实例分析
2016/06/24 PHP
php正则判断是否为合法身份证号的方法
2017/03/16 PHP
PHP操作路由器实现方法示例
2019/04/27 PHP
JS获取dom 对象 ajax操作 读写cookie函数
2009/11/18 Javascript
js 异步处理进度条
2010/04/01 Javascript
跨浏览器开发经验总结(三)   警惕“IE依赖综合症”
2010/05/13 Javascript
在jquery中处理带有命名空间的XML数据
2011/06/13 Javascript
jquery实现奇偶行赋值不同css值
2012/02/17 Javascript
JavaScript中的getTimezoneOffset()方法使用详解
2015/06/10 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
js内置对象处理_打印学生成绩单的简单实现
2016/09/24 Javascript
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
vue2.0与bootstrap3实现列表分页效果
2017/11/28 Javascript
AngularJS实现的生成随机数与猜数字大小功能示例
2017/12/25 Javascript
vue中动态绑定表单元素的属性方法
2018/02/23 Javascript
echarts同一页面中四个图表切换的js数据交互方法示例
2018/07/03 Javascript
javascript实现时间日期的格式化的方法汇总
2020/08/06 Javascript
[01:14]DOTA2 7.22版本新增神杖效果展示(智力英雄篇)
2019/05/29 DOTA
[56:13]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第一场 1月10日
2021/03/11 DOTA
用pywin32实现windows模拟鼠标及键盘动作
2014/04/22 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
2018/08/02 Python
python3 实现对图片进行局部切割的方法
2018/12/05 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
2020/02/14 Python
谈谈python垃圾回收机制
2020/09/27 Python
如何利用Python 进行边缘检测
2020/10/14 Python
中国首家奢侈品O2O网购平台:第五大道奢侈品网
2017/12/14 全球购物
卡西欧G-SHOCK英国官网: 防水防震手表
2018/01/08 全球购物
远程学习的教学用品和家庭学习资源:Really Good Stuff
2020/04/27 全球购物
幼儿园迎国庆65周年活动策划方案
2014/09/16 职场文书
政风行风建设整改方案
2014/10/27 职场文书
单位租车协议书
2015/01/29 职场文书
装修公司工程部经理岗位职责
2015/04/09 职场文书
2019年自助餐厅创业计划书模板
2019/08/22 职场文书
php7中停止php-fpm服务的方法详解
2021/05/09 PHP
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
2022/02/12 MySQL