diff --git a/src/djangoblog-master/accounts/views.py b/src/djangoblog-master/accounts/views.py index ae67aec..cd40dd2 100644 --- a/src/djangoblog-master/accounts/views.py +++ b/src/djangoblog-master/accounts/views.py @@ -30,22 +30,26 @@ logger = logging.getLogger(__name__) # Create your views here. - +# xm: 用户注册视图类,继承自FormView class RegisterView(FormView): form_class = RegisterForm template_name = 'account/registration_form.html' + # xm: 添加CSRF保护装饰器 @method_decorator(csrf_protect) def dispatch(self, *args, **kwargs): return super(RegisterView, self).dispatch(*args, **kwargs) + # xm: 表单验证通过后的处理逻辑 def form_valid(self, form): if form.is_valid(): + # xm: 保存用户但不提交到数据库 user = form.save(False) user.is_active = False user.source = 'Register' user.save(True) site = get_current_site().domain + # xm: 生成邮箱验证签名 sign = get_sha256(get_sha256(settings.SECRET_KEY + str(user.id))) if settings.DEBUG: @@ -54,6 +58,7 @@ class RegisterView(FormView): url = "http://{site}{path}?type=validation&id={id}&sign={sign}".format( site=site, path=path, id=user.id, sign=sign) + # xm: 构建验证邮件内容 content = """
请点击下面链接验证您的邮箱
@@ -64,6 +69,7 @@ class RegisterView(FormView): 如果上面链接无法打开,请将此链接复制至浏览器。 {url} """.format(url=url) + # xm: 发送验证邮件 send_email( emailto=[ user.email, @@ -71,6 +77,7 @@ class RegisterView(FormView): title='验证您的电子邮箱', content=content) + # xm: 重定向到结果页面 url = reverse('accounts:result') + \ '?type=register&id=' + str(user.id) return HttpResponseRedirect(url) @@ -80,19 +87,24 @@ class RegisterView(FormView): }) +# xm: 用户登出视图类,继承自RedirectView class LogoutView(RedirectView): url = '/login/' + # xm: 添加不缓存装饰器 @method_decorator(never_cache) def dispatch(self, request, *args, **kwargs): return super(LogoutView, self).dispatch(request, *args, **kwargs) + # xm: 处理GET请求,执行登出操作 def get(self, request, *args, **kwargs): logout(request) + # xm: 删除侧边栏缓存 delete_sidebar_cache() return super(LogoutView, self).get(request, *args, **kwargs) +# xm: 用户登录视图类,继承自FormView class LoginView(FormView): form_class = LoginForm template_name = 'account/login.html' @@ -100,41 +112,45 @@ class LoginView(FormView): redirect_field_name = REDIRECT_FIELD_NAME login_ttl = 2626560 # 一个月的时间 + # xm: 添加多个安全相关的装饰器 @method_decorator(sensitive_post_parameters('password')) @method_decorator(csrf_protect) @method_decorator(never_cache) def dispatch(self, request, *args, **kwargs): - return super(LoginView, self).dispatch(request, *args, **kwargs) + # xm: 获取上下文数据,处理重定向参数 def get_context_data(self, **kwargs): redirect_to = self.request.GET.get(self.redirect_field_name) if redirect_to is None: redirect_to = '/' kwargs['redirect_to'] = redirect_to - return super(LoginView, self).get_context_data(**kwargs) + # xm: 表单验证通过后的处理逻辑 def form_valid(self, form): form = AuthenticationForm(data=self.request.POST, request=self.request) if form.is_valid(): + # xm: 删除侧边栏缓存 delete_sidebar_cache() logger.info(self.redirect_field_name) + # xm: 执行用户登录 auth.login(self.request, form.get_user()) + # xm: 处理"记住我"功能,设置会话过期时间 if self.request.POST.get("remember"): self.request.session.set_expiry(self.login_ttl) return super(LoginView, self).form_valid(form) - # return HttpResponseRedirect('/') else: return self.render_to_response({ 'form': form }) + # xm: 获取登录成功后的重定向URL def get_success_url(self): - redirect_to = self.request.POST.get(self.redirect_field_name) + # xm: 验证重定向URL的安全性 if not url_has_allowed_host_and_scheme( url=redirect_to, allowed_hosts=[ self.request.get_host()]): @@ -142,25 +158,30 @@ class LoginView(FormView): return redirect_to +# xm: 账户操作结果页面视图函数 def account_result(request): type = request.GET.get('type') id = request.GET.get('id') + # xm: 获取用户对象,不存在则返回404 user = get_object_or_404(get_user_model(), id=id) logger.info(type) if user.is_active: return HttpResponseRedirect('/') if type and type in ['register', 'validation']: if type == 'register': + # xm: 注册成功页面内容 content = ''' 恭喜您注册成功,一封验证邮件已经发送到您的邮箱,请验证您的邮箱后登录本站。 ''' title = '注册成功' else: + # xm: 验证邮箱签名 c_sign = get_sha256(get_sha256(settings.SECRET_KEY + str(user.id))) sign = request.GET.get('sign') if sign != c_sign: return HttpResponseForbidden() + # xm: 激活用户账户 user.is_active = True user.save() content = ''' @@ -175,12 +196,15 @@ def account_result(request): return HttpResponseRedirect('/') +# xm: 忘记密码视图类,继承自FormView class ForgetPasswordView(FormView): form_class = ForgetPasswordForm template_name = 'account/forget_password.html' + # xm: 表单验证通过后的处理逻辑 def form_valid(self, form): if form.is_valid(): + # xm: 根据邮箱获取用户并重置密码 blog_user = BlogUser.objects.filter(email=form.cleaned_data.get("email")).get() blog_user.password = make_password(form.cleaned_data["new_password2"]) blog_user.save() @@ -189,14 +213,17 @@ class ForgetPasswordView(FormView): return self.render_to_response({'form': form}) +# xm: 忘记密码验证码发送视图类,继承自View class ForgetPasswordEmailCode(View): + # xm: 处理POST请求,发送验证码邮件 def post(self, request: HttpRequest): form = ForgetPasswordCodeForm(request.POST) if not form.is_valid(): return HttpResponse("错误的邮箱") to_email = form.cleaned_data["email"] + # xm: 生成并发送验证码 code = generate_code() utils.send_verify_email(to_email, code) utils.set_code(to_email, code)