Django password_reset,处理使用过的URL

时间:2015-01-21 14:32:05

标签: django django-authentication

我工作的应用程序会让用户成功重置密码; urls.py包含这个:

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/

..他们的密码可以重置。

到目前为止,这不是问题,但如果用户再次访问该链接(并且看起来某些用户已经这样做了),则会向他们提供相同的邀请以更改其密码,仅在此时它当他们在框中输入值时,似乎没有任何效果。这导致一些混乱。

这是Django的预期行为吗?如果没有,是否有任何方法可以覆盖django.contrib.auth.views.password_reset_confirm并在那里检测使用过的令牌,或者在失败时重定向到警告?理想情况下,最好向他们展示一个&#34;此令牌已被使用,请尝试重新设置密码&#34;重置后屏幕而不是失败消息,但即使是后者选项也会比现在更好。

1 个答案:

答案 0 :(得分:2)

我尝试使用基于类的视图:

查看

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('/') 

<强>网址

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