django 重置密码

需求

django-allauth本身就有重置密码的功能,我需要做的是根据用户的身份证号码和工号跳转到重置密码页面,重置密码完成后能够发送一篇邮件给用户提醒密码重置成功。

网上很多是关于邮箱验证的重置密码,但都不是我需要的,调试了两天allauth源代码,终于实现了重置密码后发送邮件的功能!

ps:我的项目时采用allauth的account来实现用户的第三方登陆的。


邮箱配置

settings.py:

EMAIL_USE_SSL = True
EMAIL_HOST = 'smtp.qq.com'  # 如果是 163 改成 smtp.163.com
EMAIL_PORT = 465
EMAIL_HOST_USER = '邮箱' # 帐号
EMAIL_HOST_PASSWORD = '邮箱的验证码'  # 密码
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

在这里插入图片描述
开启服务后在EMAIL_HOST_PASSWORD 填入验证码后才能用该账号给其他邮箱发送信息。


前端

在这里插入图片描述
改写这3个HTML的代码,注意:一定一定一定不要改动action里面的url代码!!!当然,自己写视图的例外。


继承视图

先看看account里面的urls,py关于密码重置的url
在这里插入图片描述
根据url找到重置密码中用到的视图类,然后继承视图类,在各个函数里print一个标识数字,大概知道用到哪些函数,判断在哪里写发送邮件的代码。(不要忘记把url添加在自己的项目里面哦!)

最后我继承了PasswordResetView,PasswordResetFromKeyView这两个类

1 PasswordResetView

class CustomPasswordResetView(PasswordResetView):
    def post(self, request, *args, **kwargs):
        ID_number = request.POST['ID_number']
        try:
            user = User.objects.get(username=request.POST['username'])
            true_profile = get_object_or_404(UserProfile, user=user)
            user_profile = UserProfile.objects.get(ID_number=ID_number)
            if true_profile == user_profile:
                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))
                return redirect(path)
        except:
            messages.add_message(request, messages.ERROR, '信息填写错误!')
            return redirect('CustomPasswordResetView')
    def get(self, request, *args, **kwargs):
        return render(request, 'account/password_reset.html')

验证过程是通过身份证号码找到用户,再比对用户username与填写的username是否一致,一致时,即跳转到重置密码的页面。


token_generator = kwargs.get("token_generator", default_token_generator)

kwargs.get(),第一个参数是kwargs里的值,第二个参数是缺省值。(目前这一块还没很深入的了解清楚)获取令牌生成器。


temp_key = token_generator.make_token(user)

创建一个令牌

然后将令牌传递到PasswordResetFromKeyView类中。

这时已经能够成功修改密码了!但是还没有实现修改密码后发送信息提醒用户密码已经修改了。

2 PasswordResetFromKeyView

通过逐个调试里面的函数,发现form_valid()这个函数是在修改完密码时执行的,所以将这个函数赋值过来覆盖原来的form_valid()函数。

class PasswordResetFromKeyViewNew(PasswordResetFromKeyView):
    def form_valid(self, form):
        form.save()
        adapter = get_adapter(self.request)
        if self.reset_user and app_settings.LOGIN_ATTEMPTS_LIMIT:
            # User successfully reset the password, clear any
            # possible cache entries for all email addresses.
            for email in self.reset_user.emailaddress_set.all():
                from_email = None
                subject = '一滴账号重置密码通知'
                text_content = '您好!您在一滴平台上重置了密码,若该操作若非本人操作,请立即联系技术部部门进行处理!.文本'
                html_content = '<p>您好!您在一滴平台上重置了密码,若该操作若非本人操作,请立即联系技术部部门进行处理!.HTML</p>'
                msg = EmailMultiAlternatives(subject, text_content, from_email, [email])
                msg.attach_alternative(html_content, "text/html")
                msg.send()

                adapter._delete_login_attempts_cached_email(
                    self.request, email=email.email
                )

        adapter.add_message(
            self.request,
            messages.SUCCESS,
            "account/messages/password_changed.txt",
        )
        if app_settings.LOGIN_ON_PASSWORD_RESET:
            return perform_login(
                self.request,
                self.reset_user,
                email_verification=app_settings.EMAIL_VERIFICATION,
            )

        return super(PasswordResetFromKeyView, self).form_valid(form)

password_reset_from_key = PasswordResetFromKeyViewNew.as_view()

在删除电子邮件缓存之前将提醒邮件发送到用户邮箱当中。

https://code.ziqiangxuetang.com/django/django-send-email.html

补充知识

*args表示任何多个无名参数,它是一个tuple
**kwargs表示关键字参数,它是一个dict

总结

看源码改代码是非常头疼的,调试的时候要细心细心细心!!!用print比debug快的多!

还有很多没有很清楚,令牌这块还没有学透,等我解决了连接第三方应用登陆再来记录令牌的应用。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本课程为Django第七季课程:用户登陆模块     本季课程主要实现图片的上传和展示,用户登陆账号的管理,用户账号的登陆、个人信息的修改、注销,使用邮箱地址找回密码。包含的主要知识点有:virtualenv虚拟环境、pip下载包、多app项目开发、templates模板的继承、font-awesome图标的使用、原生SQL语句和数据库交互、ORM模型和数据库交互、LayUI页面布局、jQuery实现用户交互、Ajax的异步请求、页面的块状展示数据、表格展示数据、表格的分页、数据的增改删改、Layer弹出层使用、表单的验证、照片的上传、照片的展示、图片展示的分页、照片的标准和放大、用户账号的增删改查、用户的登陆、Session和Cookie、Redis服务器的部署和基本配置、Django发送邮件等等知识点      本案例完整的演示了项目实现过程,虽然不复杂,但涉及的内容非常多,特别是前后端交互的时候,有诸多的坑等着你去踩,好在王老师全程代码呈现,带着大家一起填坑,大大提高学习效率的同时,也培养了大家良好的代码习惯,希望大家一致跟着王老师学习Python开发。 Django第八季课程课程预告:权限管理Django第九季课程课程预告:Web项目发布到阿里云 课程目标:本系列课程是从零基础开始并深入讲解Django,最终学会使用Django框架开发企业级的项目。课程知识点详细,项目实战贴近企业需求。本系列课程除了非常详细的讲解Django框架本身的知识点以外,还讲解了web开发中所需要用到的技术,学完本系列课程后,您将独立做出一个具有后台管理系统,并且前端非常优美实用的网站。对于从事一份Python Web开发相关的工作简直轻而易举。 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值