2015-01-21 2 views
0

Приложение, в котором я работаю, позволит пользователям успешно сбросить свой пароль; urls.py содержит следующее:Django password_reset, обработка использованного URL

url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>.+)/$', 
         'django.contrib.auth.views.password_reset_confirm', 
         name='password_reset_confirm') 

Это работает, как ожидалось, направляя пользователя к таким URL, как:

http://example.com/reset/MTNzgN/3ly-466604bc1524f789c120/ 

..where их пароль может быть сброшен.

До сих пор это не проблема, но если пользователи снова посещают ссылку (и, похоже, некоторые пользователи это делают), они получают одно и то же приглашение изменить свой пароль, только в этом случае не окажут никакого эффекта, когда они вводят значения в поля. Это приводит к некоторой путанице.

Является ли это ожидаемым поведением Django? Если нет, есть ли какие-либо способы, с помощью которых я мог бы переопределить django.contrib.auth.views.password_reset_confirm и обнаружить использованный токен там или перенаправить на предупреждение при ошибке? В идеале было бы лучше показать им, что «этот маркер уже использовался, попробуйте сбросить пароль снова», а не сообщение об ошибке после сброса, но даже последний вариант будет лучше, чем то, что он делает сейчас.

ответ

2

Я попытался, как это, используя Class Based View:

Вид:

class PasswordResetConfirmView(FormView): 
    template_name = "test_template.html" 
    success_url = '/account/login' 
    form_class = SetPasswordForm 

    def get(self, request, uidb64=None, token=None, *arg, **kwargs): 
     UserModel = get_user_model() 
     try: 
      uid = urlsafe_base64_decode(uidb64) 
      user = UserModel._default_manager.get(pk=uid) 
     except (TypeError, ValueError, OverflowError, UserModel.DoesNotExist): 
      user = None 
     if user is not None and default_token_generator.check_token(user, token): 
      return super().get(request, uidb64=None, token=None, *arg, **kwargs) 

     else: 
      messages.error(request,'The reset password link is no longer valid.') 
      return redirect('/') 

Url:

urlpatterns += patterns('', 
         url(r'^account/reset_password_confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$', PasswordResetConfirmView.as_view(),name='reset_password_confirm'), 
         ) 
+0

Это выглядит хорошо, спасибо. Могу я спросить, однако, где в приложении вы добавляете класс PasswordResetConfirmView, пожалуйста? – knirirr

+1

В views.py моего приложения. На самом деле я создал собственное пользовательское представление для сброса пароля, но я следил за схемой кодирования самой собственной парольной игры для домена django. Посмотрите здесь: http://ruddra.com/blog/2014/10/21/make-own-forgot-slash-reset-password-in-django/ :) – ruddra

Смежные вопросы