利用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通过websocket与js客户端通信示例分析
Jun 25 Python
在RedHat系Linux上部署Python的Celery框架的教程
Apr 07 Python
在Python的Flask框架中实现单元测试的教程
Apr 20 Python
python中self原理实例分析
Apr 30 Python
python实现TCP服务器端与客户端的方法详解
Apr 30 Python
Python动刷新抢12306火车票的代码(附源码)
Jan 24 Python
Python闭包之返回函数的函数用法示例
Jan 27 Python
python绘制散点图并标记序号的方法
Dec 11 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
Apr 08 Python
Python新手如何进行闭包时绑定变量操作
May 29 Python
利用Python实现斐波那契数列的方法实例
Jul 26 Python
python的dict判断key是否存在的方法
Dec 09 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 正则 过滤html 的超链接
2009/06/02 PHP
hadoop常见错误以及处理方法详解
2013/06/19 PHP
php连接函数implode与分割explode的深入解析
2013/06/26 PHP
PHP缓存集成库phpFastCache用法
2014/12/15 PHP
php抽象类用法实例分析
2015/07/07 PHP
Ajax和PHP正则表达式验证表单及验证码
2016/09/24 PHP
php魔术方法功能与用法实例分析
2016/10/19 PHP
用PHP将Unicode 转化为UTF-8的实现方法(推荐)
2017/02/08 PHP
Yii2选项卡的简单使用
2017/05/26 PHP
PHP实现cookie跨域session共享的方法分析
2019/08/23 PHP
javascript jQuery $.post $.ajax用法
2008/07/09 Javascript
jquery+javascript编写国籍控件
2015/02/12 Javascript
jQuery往textarea中光标所在位置插入文本的方法
2015/06/26 Javascript
四种参数传递的形式——URL,超链接,js,form表单
2015/07/24 Javascript
简单谈谈JavaScript的同步与异步
2015/12/31 Javascript
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
纯JS代码实现气泡效果
2016/05/04 Javascript
Bootstrap弹出框(Popover)被挤压的问题小结
2017/07/11 Javascript
微信小程序倒计时功能实现代码
2017/11/09 Javascript
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
解决在vue项目中,发版之后,背景图片报错,路径不对的问题
2018/03/06 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
微信jssdk逻辑在vue中的运用详解
2018/11/14 Javascript
this.$toast() 了解一下?
2019/04/18 Javascript
微信小程序调用微信支付接口的实现方法
2019/04/29 Javascript
使用JS实现鼠标放上图片进行放大离开实现缩小功能
2021/01/27 Javascript
[03:42]2018完美盛典-《加冕》
2018/12/16 DOTA
[05:08]DOTA2-DPC中国联赛3月6日Recap集锦
2021/03/11 DOTA
python3库numpy数组属性的查看方法
2018/04/17 Python
python3.7简单的爬虫实例详解
2019/07/08 Python
python通过SSH登陆linux并操作的实现
2019/10/10 Python
python实现马丁策略的实例详解
2021/01/15 Python
写好求职应聘自荐信的三部曲
2013/09/21 职场文书
英语专业个人求职自荐信
2013/09/21 职场文书
致裁判员加油稿
2014/02/08 职场文书
交通志愿者活动总结
2014/06/27 职场文书