update_session_auth_hash не позволит пользователю войти в систему без, казалось бы, неуместной строки кода - PullRequest
0 голосов
/ 20 апреля 2019

Я пытаюсь сбросить пароль, используя SetPasswordForm в Django.Однако аутентифицированный пользователь не останется в системе после того, как я сохраню форму, если у меня там нет ненужной строки кода, которую я назвал, NONSENE.

Это в методе form_valid.

class PasswordResetView(FormView):
    """
    Reset user password. Either with provided uid/token get parameters
    or if the user is logged in.
    """
    template_name = 'users/password_reset.html'
    form_class = SetPasswordForm
    success_url = '/'

    def corrupt_link_redirect(self, request):
        messages.error(
            self.request,
            user_strings.PASSWORD_RESET_INVALID_LINK
        )
        return redirect('forgot_password')

    def get_form(self):
        try:
            user = User.objects.get(pk=self.request.session.get('pw_pk'))
        except User.DoesNotExist:
            return Http404() ## Refine this
        return self.form_class(user, **self.get_form_kwargs())

    def post(self, request, *args, **kwargs):
        if not request.session.get('pw_pk') and request.user.is_authenticated:
            request.session['pw_pk'] = request.user.pk
        return super(PasswordResetView, self).post(request, *args, **kwargs)

    def get(self, request, *args, **kwargs):
        if request.user.is_authenticated:
            ## User is logged in so present them with the password reset form
            request.session['pw_pk'] = request.user.pk
            return super(PasswordResetView, self).get(request, *args, **kwargs)
        try:
            uidb64 = request.GET.get('uid')
            token = request.GET.get('token')
            if uidb64 is None or token is None:
                return self.corrupt_link_redirect(request) ## Failure redirect
            uid = force_text(urlsafe_base64_decode(uidb64))
            user = User.objects.get(pk=uid)
        except (TypeError, ValueError, OverflowError, User.DoesNotExist):
            return self.corrupt_link_redirect(request) ## Failure redirect

        if user is not None and PasswordResetTokenGenerator().check_token(user, token):
            request.session['pw_pk'] = user.pk
            return super(PasswordResetView, self).get(request, *args, **kwargs)
        return self.corrupt_link_redirect(request) ## Failure redirect

    def form_valid(self, form):
        try:
            NONSENSE = self.request.user.is_authenticated
            form.save()
            update_session_auth_hash(self.request, form.user)
            ## Delete session item
            if self.request.session.get('pw_pk'):
                del self.request.session['pw_pk']
        except User.DoesNotExist:
            pass
        messages.success(
            self.request,
            user_strings.PASSWORD_RESET_SUCCESS if self.request.user.is_authenticated \
            else user_strings.PASSWORD_RESET_SUCCESS + user_strings.PASSWORD_RESET_SUCCESS_LOGIN_REMINDER
        )
        return super(PasswordResetView, self).form_valid(form)
...