Представление сброса пароля без использования 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 везде.