您现在的位置是: 网站首页 >Django >Django2.0.8+xadmin2实现在线学习网站 Django

【Django在线教育平台】06.找回密码,实现忘记密码及重置密码功能

admin2019年6月4日 13:53 Django | Html | JQuery 228人已围观

Django2.0.8+xadmin2实现在线学习网站简介 Django2.0.8+xadmin2实现在线学习网站,课程、讲师、机构、用户收藏功能。GitHub地址:https://github.com/xyliurui/OnlineLearningPlatform ;Django版本:2.0.8

# 找回密码 ## 忘记密码 ### 忘记密码模板forgetpwd.html 创建,或者拷贝到对应目录 ```html <h3>密码重置</h3> <p>密码忘记填写表单重置</p> <form method="post" action="/forgetpwd/" autocomplete="off"> <input name="email" value="{% if forgetpwd_form.email.value %}{{ forgetpwd_form.email.value }}{% endif %}" type="email" class="form-control" placeholder="请输入注册时的邮箱" required=""> {% if forgetpwd_form.errors.email %} <span class="help-block m-b-none"> {{ forgetpwd_form.errors.email.as_text }}</span> {% endif %} <div class="input-group"> <input type="text" name="captcha_1" required="" id="id_captcha_1" class="form-control" autocapitalize="off" autocomplete="off" autocorrect="off" spellcheck="false" style="width: 75%" placeholder="验证码"> <img style="width: 25%; float: left; margin-top: 15px;height: 30px" src="{{ image_url }}" alt="captcha" class="captcha"> <input type="hidden" name="captcha_0" value="{{ hashkey }}" required="" id="id_captcha_0"> </div> {# register_form.captcha #} <!-- 可以使用register_form表单自动生成表单框和验证码图片 --> {#【{{ image_url }}、{{ hashkey }}】#} {% if forgetpwd_form.errors.captcha %} <span class="help-block m-b-none"> {{ forgetpwd_form.errors.captcha.as_text }}</span> {% endif %} {% csrf_token %} {% if msg %} <br> <div class="alert alert-danger" style="padding: 5px;"> {{ msg }} </div> {% endif %} <button type="submit" class="btn btn-primary block full-width m-b">发 送</button> <p class="text-muted text-center"><small>想起来了?</small><a href="/login/">点此登录</a> </p> </form> <script src="{% static 'js/jquery.min.js' %}"></script> <script> $('.captcha').click(function () { $.getJSON("/captcha/refresh/", function (result) { $('.captcha').attr('src', result['image_url']); $('#id_captcha_0').val(result['key']) }); }); </script> ``` ![BLOG_20190604_135509_57](/media/blog/images/2019/06/BLOG_20190604_135509_57.png "博客图集BLOG_20190604_135509_57.png") ### 忘记密码表单ForgetPwdForm(forms.Form) ```python # 忘记密码表单 class ForgetPwdForm(forms.Form): email = forms.EmailField(required=True) captcha = CaptchaField(error_messages={'invalid': '验证码错误'}) ``` ### 忘记密码视图ForgetPwdView(View) ```python from .forms import LoginForm, RegisterForm, ForgetPwdForm # 忘记密码视图 class ForgetPwdView(View): def get(self, request): forgetpwd_form = ForgetPwdForm() # 图片验证码 hashkey = CaptchaStore.generate_key() image_url = captcha_image_url(hashkey) return render(request, 'forgetpwd.html', { 'forgetpwd_form': forgetpwd_form, 'hashkey': hashkey, 'image_url': image_url, }) ``` ### 忘记密码url ```python from users.views import user_login, LoginView, RegisterView, ActiveUserView, ForgetPwdView urlpatterns = [ path('admin/', admin.site.urls), path('xadmin/', xadmin.site.urls), path('', TemplateView.as_view(template_name='index.html'), name='index'), # path('login/', TemplateView.as_view(template_name='login.html'), name='login'), # path('login/', user_login, name='login'), path('login/', LoginView.as_view(), name='login'), # 基于类方法实现登录,这里是调用它的方法 path('register/', RegisterView.as_view(), name='register'), re_path('register/active/(?P<active_code>.*)/', ActiveUserView.as_view(), name='user_active'), # 激活 path('captcha/', include('captcha.urls')), path('forgetpwd/', ForgetPwdView.as_view(), name='forgetpwd'), # 忘记密码 ] ``` ### 忘记密码post逻辑ForgetPwdView(View) 发送邮件模块email_send.py增加忘记密码操作 ```python # 发送注册邮件 def send_register_email(request_uri, email, send_type='register'): # 发送之前先保存到数据库,到时候查询链接是否存在 # 实例化一个EmailVerifyRecord对象 email_record = EmailVerifyRecord() # 生成随机的code放入链接 code = random_str(16) email_record.code = code email_record.email = email email_record.send_type = send_type email_record.save() # 定义邮件内容 email_title = '' email_body = '' if send_type == 'register': email_title = '在线学习平台 注册激活链接' email_body = '请点击链接激活账号:{}active/{}'.format(request_uri, code) # request_uri='http://127.0.0.1:8000/register/' # 使用Django内置函数完成邮件发送。四个参数:主题,邮件内容,从哪里发,接受者list send_status = send_mail(email_title, email_body, settings.EMAIL_FROM, [email]) if send_status: return True else: return False elif send_type == 'forget': email_title = '在线学习平台 密码重置链接' email_body = '请点击链接重置密码:{}reset/{}'.format(request_uri, code) # request_uri='http://127.0.0.1:8000/forgetpwd/' # 使用Django内置函数完成邮件发送。四个参数:主题,邮件内容,从哪里发,接受者list send_status = send_mail(email_title, email_body, settings.EMAIL_FROM, [email]) if send_status: return True else: return False ``` 忘记密码增加发送邮件功能 ```python # 忘记密码视图 class ForgetPwdView(View): def get(self, request): # print(request.build_absolute_uri()) forgetpwd_form = ForgetPwdForm() # 图片验证码 hashkey = CaptchaStore.generate_key() image_url = captcha_image_url(hashkey) return render(request, 'forgetpwd.html', { 'forgetpwd_form': forgetpwd_form, 'hashkey': hashkey, 'image_url': image_url, }) def post(self, request): forgetpwd_form = ForgetPwdForm(request.POST) # 图片验证码 hashkey = CaptchaStore.generate_key() image_url = captcha_image_url(hashkey) if forgetpwd_form.is_valid(): email = request.POST.get('email', '') if UserProfile.objects.filter(email=email): # 如果邮箱是注册过的,就发送改密邮件,然后跳回登录页面 send_register_email(request_uri=request.build_absolute_uri(), email=email, send_type='forget') return render(request, 'login.html', { 'msg': '重置密码邮件已发送,请注意查收', }) else: return render(request, 'forgetpwd.html', { 'forgetpwd_form': forgetpwd_form, 'hashkey': hashkey, 'image_url': image_url, 'msg': '邮箱未注册,请检查是否输入错误' }) else: return render(request, 'forgetpwd.html', { 'forgetpwd_form': forgetpwd_form, 'hashkey': hashkey, 'image_url': image_url, }) ``` ## 重置密码 ### 收到重置密码链接 ``` 请点击链接重置密码:http://127.0.0.1:8000/forgetpwd/reset/bP6hGgtU4DUN8lnd ``` ### 跳转密码修改url ```python from users.views import user_login, LoginView, RegisterView, ActiveUserView, ForgetPwdView, RestpwdView urlpatterns = [ path('admin/', admin.site.urls), path('xadmin/', xadmin.site.urls), path('', TemplateView.as_view(template_name='index.html'), name='index'), # path('login/', TemplateView.as_view(template_name='login.html'), name='login'), # path('login/', user_login, name='login'), path('login/', LoginView.as_view(), name='login'), # 基于类方法实现登录,这里是调用它的方法 path('register/', RegisterView.as_view(), name='register'), re_path('register/active/(?P<active_code>.*)/', ActiveUserView.as_view(), name='user_active'), # 激活 path('captcha/', include('captcha.urls')), path('forgetpwd/', ForgetPwdView.as_view(), name='forgetpwd'), # 忘记密码 re_path('forgetpwd/reset/(?P<active_code>.*)/', RestpwdView.as_view(), name='resetpwd'), # 密码重置验证 ] ``` ### 跳转密码修改表单RestpwdView(View) 点击上面的,这个视图验证后跳转到,如果验证通过,返回密码修改表单 ```python # 重置密码 class RestpwdView(View): def get(self, request, active_code): # 查询验证码是否存在 all_record = EmailVerifyRecord.objects.filter(code=active_code) if all_record: for record in all_record: email = record.email return render(request, 'pwdreset.html', { 'email': email }) else: forgetpwd_form = ForgetPwdForm() hashkey = CaptchaStore.generate_key() image_url = captcha_image_url(hashkey) return render(request, 'forgetpwd.html', { 'forgetpwd_form': forgetpwd_form, "msg": "您的重置链接无效", 'hashkey': hashkey, 'image_url': image_url, }) ``` ### 密码修改模板pwdreset.html ```html <h3 class="no-margins">重置修改</h3> <p class="m-t-md">密码重置修改</p> <form method="post" action="{% url 'modify_pwd' %}" autocomplete="off"> <input name='email' type="text" value="{{ email }}" hidden /> <input name='password' type="password" class="form-control pword m-b" placeholder="密码" /> {% if modifypwd_form.errors.password %} <span class="help-block m-b-none"> {{ modifypwd_forms.errors.password.as_text }}</span> {% endif %} <input name='re_password' type="password" class="form-control pword m-b" placeholder="重复密码" /> {% if modifypwd_form.errors.re_password %} <span class="help-block m-b-none"> {{ modifypwd_form.errors.re_password.as_text }}</span> {% endif %} {% if msg %} <div class="alert alert-danger" style="padding: 5px;"> {{ msg }} </div> {% endif %} {% csrf_token %} <a href="/login/">返回登录</a> <button type="submit" class="btn btn-success btn-block">修 改</button> </form> ``` ### 密码修改表单ModifyPwdForm(forms.Form) ```python # 重置密码form实现 class ModifyPwdForm(forms.Form): # 密码不能小于5位 password1 = forms.CharField(required=True, min_length=5) # 密码不能小于5位 password2 = forms.CharField(required=True, min_length=5) ``` ### 密码修改视图 ```python from .forms import LoginForm, RegisterForm, ForgetPwdForm, ModifyPwdForm # 修改密码 class ModifypwdView(View): def post(self, request): modifypwd_form = ModifyPwdForm(request.POST) if modifypwd_form.is_valid(): pwd1 = request.POST.get("password", "") pwd2 = request.POST.get("re_password", "") email = request.POST.get("email", "") # 如果两次密码不相等,返回错误信息 if pwd1 != pwd2: return render(request, "pwdreset.html", { "email": email, "msg": "密码不一致", 'modifypwd_form': modifypwd_form, }) # 如果密码一致 user = UserProfile.objects.get(email=email) # 加密成密文 user.password = make_password(pwd2) # save保存到数据库 user.save() return render(request, "login.html", {"msg": "密码修改成功,请登录"}) else: email = request.POST.get("email", "") return render(request, 'pwdreset.html', { 'email': email, 'modifypwd_form': modifypwd_form, }) ``` ### 密码修改url ```python from users.views import user_login, LoginView, RegisterView, ActiveUserView, ForgetPwdView, RestpwdView, ModifypwdView urlpatterns = [ path('admin/', admin.site.urls), path('xadmin/', xadmin.site.urls), path('', TemplateView.as_view(template_name='index.html'), name='index'), # path('login/', TemplateView.as_view(template_name='login.html'), name='login'), # path('login/', user_login, name='login'), path('login/', LoginView.as_view(), name='login'), # 基于类方法实现登录,这里是调用它的方法 path('register/', RegisterView.as_view(), name='register'), re_path('register/active/(?P<active_code>.*)/', ActiveUserView.as_view(), name='user_active'), # 激活 path('captcha/', include('captcha.urls')), path('forgetpwd/', ForgetPwdView.as_view(), name='forgetpwd'), # 忘记密码 re_path('forgetpwd/reset/(?P<active_code>.*)/', RestpwdView.as_view(), name='resetpwd'), # 密码重置验证 path('modify_pwd/', ModifypwdView.as_view(), name="modify_pwd"), # 密码修改 ] ```

很赞哦! (0)

文章交流

  • emoji
0人参与,0条评论

当前用户

未登录,点击   登录

站点信息

  • 建站时间:网站已运行590天
  • 系统信息:Linux
  • 后台程序:Python: 3.6.6
  • 网站框架:Django: 2.2.9
  • 文章统计:222 篇
  • 文章评论:40 条
  • 腾讯分析网站概况-腾讯分析
  • 百度统计网站概况-百度统计
  • 微信公众号:扫描二维码,关注我们
返回
顶部
标题 换行 登录
网站