前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >重写allauth重置密码的方法

重写allauth重置密码的方法

作者头像
Hsinyan
发布2022-06-19 17:58:36
6610
发布2022-06-19 17:58:36
举报

分析

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

重写form表单

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

代码语言:javascript
复制
class CustomPasswordResetView(PasswordResetView):

    def post(self, request, *args, **kwargs):
        reset_password_form = ResetPasswordForm(request.POST)
        if reset_password_form.is_valid():
            # 取到身份证之后取到用户对象
            identity_card = reset_password_form.cleaned_data['identity_card']
            username = UserProfile.objects.get(
                identity_card=identity_card)
            user = User.objects.get(username=username)
            # 生成token
            token_generator = kwargs.get(
                "token_generator", default_token_generator)
            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),
            )
            url = build_absolute_uri(request, path)
            # 重定向至修改密码链接
            return redirect(url)
        else:
            return render(request, 'account/identity_card_error.html')

同时在form.py中也添加下面的内容

代码语言:javascript
复制
# 重写重置密码表单
class ResetPasswordForm(forms.Form):

    """
    重置密码表单,要求验证身份证
    """
    identity_card = forms.CharField(
        label='身份证号码',
        max_length=18,
        required=True)

    def clean_identity_card(self):
        # 取到身份证号码
        identity_card = self.cleaned_data["identity_card"]
        # 在UserProfile中筛选符合条件的用户,返回用户名
        # 如果用get方法的话取不到会直接报错,所以用filter方法
        # 同样的,身份证需要设置UNIQUE
        username = UserProfile.objects.filter(
            identity_card=identity_card)
        if not username:
            raise forms.ValidationError(
                _("身份证不存在")
            )
        return self.cleaned_data["identity_card"]

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

随后在settings.py中写入以下配置

代码语言:javascript
复制
ACCOUNT_FORMS = ({
    'reset_password': 'UserProfile.forms.ResetPasswordForm',
})

再在templates/account/目录下新建indentity_card_error.html

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>身份证不存在!</h3>
    <a href="/accounts/password/reset/">返回</a>
</body>
</html>

进入http://127.0.0.1:8000/accounts/password/reset/即可通过输入身份证号码重置密码

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 分析
  • 重写form表单
相关产品与服务
腾讯企业邮
腾讯企业邮(Tencent Exmail)是腾讯基于多年海量用户邮件系统研发和运营经验,为企业量身订造的一套办公用邮箱系统。稳定、简洁和快速,整合了丰富的企业应用,涵盖资源共享、消息发布、组织管理等方面。腾讯企业邮和微信生态深度整合,为您提供便捷高效的移动邮件解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档