Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Django | allauth】重写allauth重置密码方法

【Django | allauth】重写allauth重置密码方法

原创
作者头像
计算机魔术师
发布于 2022-08-16 06:53:53
发布于 2022-08-16 06:53:53
1.5K00
代码可运行
举报
文章被收录于专栏:计算机魔术师计算机魔术师
运行总次数:0
代码可运行
在这里插入图片描述
在这里插入图片描述

🤵‍♂️ 个人主页: @计算机魔术师

👨‍💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。

该文章收录专栏

✨[---【Django | 项目开发】从入门到上线 专栏---](https://blog.csdn.net/weixin_66526635/category_11905572.html)✨

@toc

一、场景需求

在allauth 中默认重置密码的方式是用户发送重置密码的请求后,发送重置密码的链接到用户的邮箱里面重置密码,如果使用QQ邮箱的SMTP服务,一天最多只能发送50封邮件,这样是明显不满足需求的,而如果为了实现此功能去部署一台邮件服务器或者申请一个企业邮箱,动辄几千一年的费用实在伤不起。所以在中小型的项目中,有一种折中的方法,即用户通过输入自己的身份证这里已电话为例即可重置对应的账号密码。

二、重写表单模型

  • form.py 添加表单模型 (处理手机号)
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from django import forms

# 重写重置密码表单
class ResetPasswordForm(forms.Form):
    """
    重置密码表单,需要手机号验证
    """

    tel = forms.CharField(max_length=20, required=True, label='Telephone')

    # 获取电话号码
    def clean_identity_tel(self):
        tel = self.cleaned_data['tel']
        print(tel)
        """
        由于用get获取对象,如果获取不到会报错,所以这里使用filter
        获取失败返回空对象列表
        在UserProfile中筛选符合条件的用户,返回用户名
        """
        username = UserProfile.objects.filter(tel=tel)
        if not username:
            raise forms.ValidationError("手机号错误!!")

        return self.cleaned_data['tel']

    def save(self, request, **kwargs):
        return self.cleaned_data['tel']

三、重写view视图函数类

allauth中的重置密码的类视图位于allauth.account.views.PasswordResetView,我们需要在views.py中继承这个类并且重写它的post方法。

  • view.py视图函数

注意!!这里的default_token_generator函数是allauth中的form.py的函数,不是django.contib,auth.token的,不然会报 bad token 错误,因为生成token的方法是不一样的(还有邮箱等)

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from allauth.account.forms import default_token_generator,SignupForm  # 注意!! token生成实在allauth里面,不是django自带得token生成器
from allauth.account.utils import user_pk_to_url_str
from allauth.account.views import PasswordResetView
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.http import HttpRequest
from django.shortcuts import render, get_object_or_404, reverse, redirect, HttpResponseRedirect

from userprofile.forms import UseProfileForm, ResetPasswordForm
from userprofile.models import UserProfile


# 重写重置密码表单
class CustomPasswordResetView(PasswordResetView):

    def post(self, request, *args, **kwargs):
        reset_password_form = ResetPasswordForm(request.POST)
        if reset_password_form.is_valid():

            # 从电话筛选出 用户对象
            tel = reset_password_form.clean_identity_tel()
            # UseProfile 中由于user相同属性的 username
            username = UserProfile.objects.get(tel=tel)
            user = User.objects.get(username=username)
            # 查看传参有无 令牌
            token_generator = kwargs.get(
                "token_generator", default_token_generator)
            # 没有生成token
            temp_key = token_generator.make_token(user)
            # 反向解析路径,(并传令牌参数)
            path = reverse(
                "account_reset_password_from_key",
                kwargs=dict(uidb36=user_pk_to_url_str(user), key=temp_key),
            )
            # 在根目录下建立绝对路径(self = request)
            url = HttpRequest.build_absolute_uri(request, path)
            # 重定向至修改密码链接
            return redirect(url)

        else:
            return render(request, 'account/telephone_error.html', {'content': "电话错误(表单格式错误)"})

# 注意 这里不能加上 login_required 的限制! 不然登录页面 忘记密码就会成功跳转页面!
password_reset = CustomPasswordResetView.as_view()
  • setting.py 添加配置(重写表单选项)
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
ACCOUNT_FORMS = ({
    'reset_password': 'Userprofile.forms.ResetPasswordForm'
})

五、配置项目路由

注意!!!: 在 引入 扩展模型应用路由allauth应用 和 userprofile 谁在上方一定要考虑好,不然路由覆盖等会出现页面失效或者报错的情况!!(一般默认allauth在上方),这里为了实现密码重置,要让 account/password/reset 不能走 allauth 的注册视图类,又不能修改allauth 源码,此时我们使用继承并在 项目 路由修改 优先级,优先进去扩展应用模型的 重写密码类。

  • 项目 urls.py
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from django.contrib import admin
from django.urls import path, include

import userprofile.views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', userprofile.views.profile),  # 首页 则为信息页(当未登录 自动跳转到login页)
    # 注意路由最后 一个 /
    path('accounts/password/reset/', userprofile.views.password_reset, name='account_reset_password'),
    path('accounts/', include('allauth.urls')),
    path('accounts/', include('userprofile.urls'))
]
  • 效果:
    在这里插入图片描述
    在这里插入图片描述

参考文献:

Django的objects.get和objects.filter方法详解和区别

Python中的*(星号)和**(双星号)完全详解

raise 报异常异常用法

allauth 密码重置 *

as_view()解析

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Django+Bootstrap+Mysql 搭建个人博客 (六)
6.1.comments插件 (1)安装 pip install django-contrib-comments (02)settings INSTALLED_APPS = [ '
zhang_derek
2018/05/30
1.9K0
重写allauth重置密码的方法
在allauth中,默认重置密码的方式是用户发送重置密码的请求后,发送重置密码的链接到用户的邮箱里面,如下图所示,用户点击此链接就可以修改与该邮箱绑定的账号的密码。但是这样存在一个问题,如果使用QQ邮箱的SMTP服务,一天最多只能发送50封邮件,这样是明显不满足需求的。而如果为了实现此功能去部署一台邮件服务器或者申请一个企业邮箱,动辄几千一年的费用实在伤不起。所以在中小型的项目中,有一种折中的方法,即用户通过输入自己的身份证即可重置对应的账号密码。
Hsinyan
2022/06/19
7330
重写allauth重置密码的方法
python3+django2 开发易语言网络验证(中)
第四步:网络验证的逻辑开发 1.将model注册到adminx.py中 1.在apps/yanzheng目录下新建admin.py 文件,添加代码: import xadmin from xadmin import views from .models import Cards class BaseSetting(object): """ 引入更换主题功能 """ enable_themes = True use_bootswatch = True class
玩蛇的胖纸
2018/06/08
5.9K0
【Python全栈100天学习笔记】Day44 Web表单介绍及使用
我们继续来完成上一章节中的项目,实现“用户注册”和“用户登录”的功能,并限制只有登录的用户才能为老师投票。Django框架中提供了对表单的封装,而且提供了多种不同的使用方式。
天道Vax的时间宝藏
2022/04/02
8780
【Python全栈100天学习笔记】Day44 Web表单介绍及使用
django如何两步实现邮箱重置密码
django内置了密码重置功能,其实我们只需要在urls.py文件里修改一行然后添加一行即可,修改后效果如下
追马
2020/07/03
1.1K0
Django实战(一)- 搭建简单的博客系统
1.要求 1、用户可以注册、登录 2、登陆后,用户可以发表博客、查看博客列表、修改博客、删除博客;博客包含标题、内容、照片 3、如果用户没有登录就尝试发表博客、修改博客、删除博客,提示用户去登录
Python攻城狮
2018/08/23
1.1K0
Django实战(一)- 搭建简单的博客系统
Django用户登录与注册系统
一、创建项目 1.1.创建项目和app django-admin startproject mysite_login python manage.py startapp login 1.2.设置时区和语言 Django默认使用美国时间和英语,在项目的settings文件中,如下所示: LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True 我们把它改为亚洲/上海时间和中文 LAN
zhang_derek
2018/04/11
11.5K0
Django用户登录与注册系统
django 开发忘记密码通过邮箱找回功能
一、流程分析: 1.点击忘记密码====》forget.html页面,输入邮箱和验证码,发送验证链接网址的邮件====》发送成功,跳到send_success.html提示 2.到邮箱里找到验证链接网址,访问重设密码网址reset.html===》重设密码提交数据,成功则返回首页,失败则返回错误信息 二、 1.users/forms.py文件中 from django import forms from captcha.fields import CaptchaField ....... #forge
玩蛇的胖纸
2018/06/08
1.8K0
【Django | allauth】useprofile 用户模型扩展
还没账户的小伙伴 速速点击链接跳转牛客网登录注册 开始刷爆题库,速速通关面试吧🙋‍♂️
计算机魔术师
2023/11/20
2580
Django中拓展用户模型
本文基于上一篇文章的基础上进行修改Django中allauth的安装与基本使用
Hsinyan
2022/06/19
1K0
Django中拓展用户模型
【Django | allauth】useprofile 用户模型扩展
在allauth 包中复制粘贴templates 的account包到该项目的templates的account下,原因:
计算机魔术师
2022/08/16
1.2K0
零基础使用Django2.0.1打造在线教育网站(十四):用户密码找回
努力与运动兼备~~~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!
啃饼思录
2018/09/06
9980
Django教程(四)- Django模板及进阶
需求:编写注册提交,“密码”与“确认密码”不一致,显示密码不一样。成功后在另一个页面显示 代码操作:
Python攻城狮
2018/08/23
7910
Django教程(四)- Django模板及进阶
使用django-allauth管理用户登录与注册
 django-allauth 是非常受欢迎的管理用户登录与注册的第三方 Django 安装包,django-allauth 集成了 local 用户系统 和 social 用户系统,其 social 用户系统 可以挂载多个账户。 django-allauth 能实现以下核心功能:
菲宇
2019/06/13
7K0
Django入门笔记:身份认证模块
从之前的学习我们发现,一直在blog应用中进行开发。本章开始新建另一个App来开发,介绍Django的身份认证模块,实现用户登录、注册、注销。
宇宙之一粟
2020/10/26
5160
Python Django个人网站搭建9-对用户注册和删除的实现
作者: zifanwang  发布于2020-05-15
zifan
2021/12/14
9980
Python Django个人网站搭建9-对用户注册和删除的实现
Django 之Form表单的常用操作
普通Form表单的提交 <!-- name:index.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/" method="post"> <p>账号:<input type="text" name="username"><span>{{ error.username }}<
王瑞MVP
2022/12/28
1.2K0
Django+xadmin打造在线教育平台(三)
代码 github下载 五、用户注册 主要实现功能 用户输入邮箱、密码和验证码,点注册按钮 如果输入的不正确,提示错误信息 如果正确,发送激活邮件,用户通过邮件激活后才能登陆 即使注册功能,没有激活的用户也不能登陆 5.1.初步视图 users/views.py class RegisterView(View): '''用户注册''' def get(self,request): return render(request,'register.html')  用户以g
zhang_derek
2018/04/11
4.3K1
Django+xadmin打造在线教育平台(三)
Django实战-用户注册和登陆系统
每当我们开始一个新项目的时候,通常都会搭建一个全新、独立、隔离的项目环境,这样做的好处自然不必多说。有很多种建立项目虚拟环境的工具,使用比较普遍的是Python中的virtualenv。安装好virtualenv工具后,进入想要放置的项目文件夹,建立一个虚拟环境,激活环境,安装django。
菲宇
2019/07/31
7.8K0
Django实战-用户注册和登陆系统
Django+xadmin打造在线教育平台(二)
代码 github下载 三、xadmin后台管理 3.1.xadmin的安装 django2.0的安装(源码安装方式): https://github.com/sshwsfc/xadmin/tree/django2 把zip文件放到pip目录下,运行下面命令安装: pip install xadmin-django2 是文件README.rst 出现了 Unicode 解码错误,这个文件是没有什么用处的,可以新建一个同名的空白文件替换掉 首先下载zip源码包:github.com/sshwsfc/xa
zhang_derek
2018/04/11
7.1K0
Django+xadmin打造在线教育平台(二)
相关推荐
Django+Bootstrap+Mysql 搭建个人博客 (六)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档