Представление сброса пароля без использования FormViews в django

Я пытаюсь установить представление сброса пароля без использования сброса FormViews, который Django использует по умолчанию. Это означает, что я не использую приложение auth, кроме как для токенов и некоторых других мелочей.

Сейчас я сделал обычное представление, которое отображает форму email/username, и отправляет письмо пользователю с токеном:

password_reset_token = PasswordResetTokenGenerator()

def sendPasswordResetEmail(user, current_site):
    mail_subject = 'Password reset'
    message = render_to_string('myapp/password_reset_email.html', {
        'user': user,
        'domain': current_site.domain,
        'uid': urlsafe_base64_encode(force_bytes(user.pk)),
        'token': password_reset_token.make_token(user),
    })

    to_email = user.email
    email = EmailMessage(mail_subject, message, from_email='testing@testing.com', to=[to_email])
    email.send()

После этого пользователю должно быть показано представление, которое просит пользователя заполнить форму SetPasswordForm, если токен правильный и это GET-запрос. Или же он должен проверить наличие токена и проверить, действительна ли форма. Если форма и токен действительны, то пароль должен быть изменен.

Я пытаюсь немного повторить Django's PasswordResetConfirmView, но я не совсем уверен, правильно ли я это делаю. Вот как я бы это сделал, но я не могу понять, есть ли способ как-то использовать представление:

def passwordResetConfirm(request, uidb64, token):
    if request.user.is_authenticated:
        return redirect("myapp:index")

    try:
        uid = force_str(urlsafe_base64_decode(uidb64))
        user = CustomUser.objects.get(pk=uid)
    except(TypeError, ValueError, OverflowError, CustomUser.DoesNotExist):
        user = None

    if user is not None:
        if password_reset_token.check_token(user, token):
            if request.method == 'POST':
                #TODO: Check SetPasswordForm is valid
                #TODO: if form is not valid redirect to error url
                #TODO: user = form.save()
                #TODO: redirect to done url
                pass
            else:
                return render(request, "myapp/password_reset_confirm.html")

    return HttpResponse('Password reset link is invalid!')

Безопасно ли это делать? Я вижу, что в PasswordResetConfirmView они выполняют еще несколько перенаправлений, но я не уверен, что именно они делают.

Кроме того, истекает ли срок действия этих токенов? Или они будут работать вечно? То есть, если я запрошу два токена сброса пароля и не использую их, если я использую их через несколько дней, будут ли они все еще работать?

Использую Python3 и Django4. Также мой сайт использует HTTPS везде.

Вернуться на верх