From 47537de7ccb764fa2fe6a9e3f2463fce208696e3 Mon Sep 17 00:00:00 2001 From: zzy <18556579095@163.com> Date: Sun, 5 May 2019 15:50:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9/=E5=BF=98=E8=AE=B0=E5=AF=86?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/users/urls.py | 4 +- apps/users/views.py | 86 +++++++++++++++++++++++++++++++++++++++- apps/utils/email_send.py | 56 ++++++++++++++++++++++++++ boxuegu/settings.py | 9 +++++ templates/forgetpwd.html | 4 +- templates/login.html | 2 +- 6 files changed, 155 insertions(+), 6 deletions(-) create mode 100644 apps/utils/email_send.py diff --git a/apps/users/urls.py b/apps/users/urls.py index 5ca1b47..ee52c06 100644 --- a/apps/users/urls.py +++ b/apps/users/urls.py @@ -5,6 +5,8 @@ urlpatterns = [ # url(r'^register/$',views.UserRegister.as_view()), url(r'^register/$', views.UserRegister.as_view(), name='register'), url(r'^login/$', views.LoginView.as_view(), name='login'), + url(r'^forget/$', views.ForgetPwdView.as_view(), name='forget_pwd'), + url(r'^reset/(?P.*)/$', views.ResetView.as_view(), name='reset_pwd'), - + url(r'^modify_pwd/', views.ModifyPwdView.as_view(), name='modify_pwd'), ] diff --git a/apps/users/views.py b/apps/users/views.py index 9d5635e..8d66ddc 100644 --- a/apps/users/views.py +++ b/apps/users/views.py @@ -1,9 +1,11 @@ +from django.contrib.auth.hashers import make_password from django.shortcuts import render from django.urls import reverse from django.views import View -from users.models import UserProfile -from .forms import RegisterForm, LoginForm +from users.models import UserProfile, EmailVerifyRecord +from utils.email_send import send_register_eamil +from .forms import RegisterForm, LoginForm, ForgetForm, ModifyPwdForm from django.http import HttpResponse, HttpResponsePermanentRedirect @@ -93,3 +95,83 @@ class LoginView(View): # 验证失败,则在注册模板中通过register_form.errors获取错误 return render(request, 'login.html', {'form_errors': login_form.errors}) + +class ForgetPwdView(View): + + def get(self,request): + forget_form = ForgetForm() + return render(request, 'forgetpwd.html', {'forget_form': forget_form}) + + def post(self,request): + #成功返回 + forget_form = ForgetForm(request.POST) + if forget_form.is_valid(): + email = request.POST.get('email', None) + send_register_eamil(email, 'forget') + return render(request, 'send_success.html') + # 失败返回 + else: + return render(request, 'forgetpwd.html', {'forget_form': forget_form}) + +# 激活用户 +class ActiveUserView(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 + # 查找到邮箱对应的user + user = UserProfile.objects.get(email=email) + user.is_active = True + user.save() + # 验证码不对的时候跳转到激活失败页面 + else: + return render(request,'active_fail.html') + # 激活成功跳转到登录页面 + return render(request, "login.html", ) + + +class ResetView(View): + def get(self, request, active_code): + all_records = EmailVerifyRecord.objects.filter(code=active_code) + if all_records: + for record in all_records: + email = record.email + return render(request, "password_reset.html", {"email":email}) + else: + return render(request, "active_fail.html") + return render(request, "login.html") + + + +class ResetView(View): + def get(self, request, active_code): + all_records = EmailVerifyRecord.objects.filter(code=active_code) + if all_records: + for record in all_records: + email = record.email + return render(request, "password_reset.html", {"email":email}) + else: + return render(request, "active_fail.html") + return render(request, "login.html") + +class ModifyPwdView(View): + def post(self, request): + modify_form = ModifyPwdForm(request.POST) + if modify_form.is_valid(): + pwd1 = request.POST.get("password1", "") + pwd2 = request.POST.get("password2", "") + email = request.POST.get("email", "") + if pwd1 != pwd2: + return render(request, "password_reset.html", {"email":email, "msg":"密码不一致!"}) + user = UserProfile.objects.get(email=email) + user.password = make_password(pwd2) + user.save() + + return render(request, "login.html") + else: + email = request.POST.get("email", "") + return render(request, "password_reset.html", {"email":email, "modify_form":modify_form }) \ No newline at end of file diff --git a/apps/utils/email_send.py b/apps/utils/email_send.py new file mode 100644 index 0000000..70c9f22 --- /dev/null +++ b/apps/utils/email_send.py @@ -0,0 +1,56 @@ +# apps/utils/email_send.py + +from random import Random +from django.core.mail import send_mail + +from users.models import EmailVerifyRecord +from boxuegu.settings import EMAIL_FROM + +# 生成随机字符串 +def random_str(random_length=8): + str = '' + # 生成字符串的可选字符串.. + chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789' + length = len(chars) - 1 + random = Random() + for i in range(random_length): + str += chars[random.randint(0, length)] + return str + +# 发送注册邮件 +def send_register_eamil(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 = "请点击下面的链接激活你的账号: http://127.0.0.1:8000/active/{0}".format(code) + + # 使用Django内置函数完成邮件发送。四个参数:主题,邮件内容,从哪里发,接受者list + send_status = send_mail(email_title, email_body, EMAIL_FROM, [email]) + # 如果发送成功 + if send_status: + pass + + if send_type == "forget": + email_title = "博学谷找回你的密码链接" + email_body = "请点击下面的链接找回你的密码: http://127.0.0.1:8000/reset/{0}".format(code) + + # 使用Django内置函数完成邮件发送。四个参数:主题,邮件内容,从哪里发,接受者list + send_status = send_mail(email_title, email_body, EMAIL_FROM, [email]) + # 如果发送成功 + if send_status: + pass + diff --git a/boxuegu/settings.py b/boxuegu/settings.py index 76b811c..5934d2c 100644 --- a/boxuegu/settings.py +++ b/boxuegu/settings.py @@ -135,3 +135,12 @@ MEDIA_ROOT = os.path.join(BASE_DIR, 'static/media') # UserProfile 覆盖了 django 内置的 user 表 AUTH_USER_MODEL = 'users.UserProfile' + +# settings.py + +EMAIL_HOST = "smtp.qq.com" # SMTP服务器主机 +EMAIL_PORT = 25 # 端口 +EMAIL_HOST_USER = "zhangzhengyuzz@qq.com" # 邮箱地址 +EMAIL_HOST_PASSWORD = "xskspzdytxsxbfid" # 密码 +EMAIL_USE_TLS= True +EMAIL_FROM = "zhangzhengyuzz@qq.com" # 邮箱地址 \ No newline at end of file diff --git a/templates/forgetpwd.html b/templates/forgetpwd.html index 6a7f2ed..23efc44 100644 --- a/templates/forgetpwd.html +++ b/templates/forgetpwd.html @@ -26,9 +26,9 @@