利用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 cx_Oracle模块的安装和使用详细介绍
Feb 13 Python
Python实现的FTP通信客户端与服务器端功能示例
Mar 28 Python
浅析Python数据处理
May 02 Python
使用Python读取二进制文件的实例讲解
Jul 09 Python
Python 读写文件的操作代码
Sep 20 Python
Python List cmp()知识点总结
Feb 18 Python
Python获取一个用户名的组ID过程解析
Sep 03 Python
PyTorch中的Variable变量详解
Jan 07 Python
Django 拼接两个queryset 或是两个不可以相加的对象实例
Mar 28 Python
Python-jenkins模块之folder相关操作介绍
May 12 Python
Python3批量创建Crowd用户并分配组
May 20 Python
python字符串的一些常见实用操作
Apr 06 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 多维数组排序实现代码
2009/08/05 PHP
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
2014/01/14 PHP
使用ob系列函数实现PHP网站页面静态化
2014/08/13 PHP
php上传文件问题汇总
2015/01/30 PHP
smarty模板引擎基础知识入门
2015/03/30 PHP
PHP中header用法小结
2016/05/23 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
2016/09/21 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
2019/10/23 PHP
js验证表单第二部分
2006/11/25 Javascript
JS遮罩层效果 兼容ie firefox jQuery遮罩层
2010/07/26 Javascript
使用js显示当前时间示例
2014/03/02 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
2014/12/16 Javascript
JSON格式的键盘编码对照表
2015/01/29 Javascript
JavaScript中操作字符串之localeCompare()方法的使用
2015/06/06 Javascript
学习JavaScript设计模式(链式调用)
2015/11/26 Javascript
AngularJS使用angular-formly进行表单验证
2015/12/27 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
2016/05/05 Javascript
three.js实现围绕某物体旋转
2017/01/25 Javascript
深入理解javascript的getTime()方法
2017/02/16 Javascript
解决jQuery ajax动态新增节点无法触发点击事件的问题
2017/05/24 jQuery
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
JS实现指定区域的全屏显示功能示例
2019/04/25 Javascript
2019年度web前端面试题总结(主要为Vue面试题)
2020/01/12 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
Python语言的12个基础知识点小结
2014/07/10 Python
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
python代码 输入数字使其反向输出的方法
2018/12/22 Python
Python os.access()用法实例
2019/02/18 Python
详解python websocket获取实时数据的几种常见链接方式
2019/07/01 Python
经理秘书岗位职责
2013/11/14 职场文书
统计学专业毕业生的自我评价分享
2013/11/28 职场文书
森林防火标语
2014/06/23 职场文书
警察群众路线对照检查材料思想汇报
2014/10/01 职场文书
用php如何解决大文件分片上传问题
2021/07/07 PHP
win10此电脑打不开怎么办 win10双击此电脑无响应的解决办法
2022/07/23 数码科技