视频直播源码,重置当前密码的相关改动
视频直播源码,重置当前密码的相关改动
一、场景需求
在allauth 中默认重置密码的方式是用户发送重置密码的请求后,发送重置密码的链接到用户的邮箱里面重置密码,如果使用QQ邮箱的SMTP服务,一天最多只能发送50封邮件,这样是明显不满足需求的,而如果为了实现此功能去部署一台邮件服务器或者申请一个企业邮箱,动辄几千一年的费用实在伤不起。所以在中小型的项目中,有一种折中的方法,即用户通过输入自己的身份证[这里已电话为例]即可重置对应的账号密码。
二、重写表单模型
在 form.py 添加表单模型 (处理手机号)
from django import forms
1 | <br># 重写重置密码表单<br> class ResetPasswordForm(forms.Form):<br> "" "<br> 重置密码表单,需要手机号验证<br> " "" <br> tel = forms.CharField(max_length=20, required=True, label= 'Telephone' )<br> # 获取电话号码<br> def clean_identity_tel(self):<br> tel = self.cleaned_data[ 'tel' ]<br> print (tel)<br> "" "<br> 由于用get获取对象,如果获取不到会报错,所以这里使用filter<br> 获取失败返回空对象列表<br> 在UserProfile中筛选符合条件的用户,返回用户名<br> " "" <br> username = UserProfile.objects.filter(tel=tel)<br> if not username:<br> raise forms.ValidationError( "手机号错误!!" )<br> return self.cleaned_data[ 'tel' ]<br> def save(self, request, **kwargs):<br> 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的方法是不一样的(还有邮箱等)
1 | <br>from allauth.account.forms import default_token_generator,SignupForm # 注意!! token生成实在allauth里面,不是django自带得token生成器<br>from allauth.account.utils import user_pk_to_url_str<br>from allauth.account.views import PasswordResetView<br>from django.contrib.auth.decorators import login_required<br>from django.contrib.auth.models import User<br>from django.http import HttpRequest<br>from django.shortcuts import render, get_object_or_404, reverse, redirect, HttpResponseRedirect<br>from userprofile.forms import UseProfileForm, ResetPasswordForm<br>from userprofile.models import UserProfile<br>重写重置密码表单<br> class CustomPasswordResetView(PasswordResetView):<br> def post(self, request, *args, **kwargs):<br> reset_password_form = ResetPasswordForm(request.POST)<br> if reset_password_form.is_valid():<br> # 从电话筛选出 用户对象<br> tel = reset_password_form.clean_identity_tel()<br> # UseProfile 中由于user相同属性的 username<br> username = UserProfile.objects.get(tel=tel)<br> user = User.objects.get(username=username)<br> # 查看传参有无 令牌<br> token_generator = kwargs.get(<br> "token_generator" , default_token_generator)<br> # 没有生成token<br> temp_key = token_generator.make_token(user)<br> # 反向解析路径,(并传令牌参数)<br> path = reverse(<br> "account_reset_password_from_key" ,<br> kwargs=dict(uidb36=user_pk_to_url_str(user), key=temp_key),<br> )<br> # 在根目录下建立绝对路径(self = request)<br> url = HttpRequest.build_absolute_uri(request, path)<br> # 重定向至修改密码链接<br> return redirect(url)<br> else :<br> return render(request, 'account/telephone_error.html' , { 'content' : "电话错误(表单格式错误)" })<br># 注意 这里不能加上 login_required 的限制! 不然登录页面 忘记密码就会成功跳转页面!<br>password_reset = CustomPasswordResetView.as_view() |
在setting.py 添加配置(重写表单选项)
1 | ACCOUNT_FORMS = ({<br> 'reset_password' : 'Userprofile.forms.ResetPasswordForm' <br>}) |
四、配置项目路由
注意!!!: 在 引入 扩展模型应用路由时 allauth应用 和 userprofile 谁在上方一定要考虑好,不然路由覆盖等会出现页面失效或者报错的情况!!(一般默认allauth在上方),这里为了实现密码重置,要让 account/password/reset 不能走 allauth 的注册视图类,又不能修改allauth 源码,此时我们使用继承并在 项目 路由修改 优先级,优先进去扩展应用模型的 重写密码类。
项目 urls.py
1 | from django.contrib import admin<br>from django.urls import path, include <br>import userprofile.views<br>urlpatterns = [<br> path( 'admin/' , admin.site.urls),<br> path( '' , userprofile.views.profile), # 首页 则为信息页(当未登录 自动跳转到login页)<br> # 注意路由最后 一个 /<br> path( 'accounts/password/reset/' , userprofile.views.password_reset, name= 'account_reset_password' ),<br> path( 'accounts/' , include ( 'allauth.urls' )),<br> path( 'accounts/' , include ( 'userprofile.urls' ))<br>] |
以上就是 视频直播源码,重置当前密码的相关改动,更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2021-07-22 直播视频网站源码,使用ViewPager实现基本的翻页效果
2021-07-22 直播带货app开发,echarts地图数据信息流向图
2021-07-22 直播视频app源码,js设置iframe高度无效