Django password_reset,使用处理 URL
Django password_reset, handling used URL
我正在开发的一款应用可以让用户成功重置密码; 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/
..可以重置密码的地方。
到目前为止这不是问题,但是如果用户随后再次访问 link(似乎有些用户已经这样做了),他们会收到相同的更改密码邀请,只是在这种情况下,当他们在框中输入值时,它似乎没有任何效果。这会导致一些混乱。
这是 Django 的预期行为吗?如果没有,是否有任何方法可以覆盖 django.contrib.auth.views.password_reset_confirm 并检测那里使用的令牌,或者重定向到失败警告?理想情况下,最好在重置后向他们展示 "this token has already been used, please try to reset your password again" 屏幕而不是失败消息,但即使是后一种选择也会比现在更好。
我这样试过,使用 Class 基于视图:
查看:
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'),
)
我正在开发的一款应用可以让用户成功重置密码; 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/
..可以重置密码的地方。
到目前为止这不是问题,但是如果用户随后再次访问 link(似乎有些用户已经这样做了),他们会收到相同的更改密码邀请,只是在这种情况下,当他们在框中输入值时,它似乎没有任何效果。这会导致一些混乱。
这是 Django 的预期行为吗?如果没有,是否有任何方法可以覆盖 django.contrib.auth.views.password_reset_confirm 并检测那里使用的令牌,或者重定向到失败警告?理想情况下,最好在重置后向他们展示 "this token has already been used, please try to reset your password again" 屏幕而不是失败消息,但即使是后一种选择也会比现在更好。
我这样试过,使用 Class 基于视图:
查看:
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'),
)