Django密码重置确认页面加载失败:uidb64与token断言错误
Django密码重置确认页面断言错误修复
我正在开发密码重置功能,用户输入邮箱的页面运行正常,也能成功收到重置邮件,但点击邮件内的链接进入新密码设置页面时触发断言错误:assert uidb64 is not None and token is not None # checked by URLconf
我参考了Django 1.8官方的auth视图实现,以下是相关代码:
views.py代码
@sensitive_post_parameters() @never_cache def password_reset_confirm(request, uidb64=None, token=None, template_name='users/password_reset_confirm.html', token_generator=default_token_generator, set_password_form=SetPasswordForm, post_reset_redirect=None, current_app=None, extra_context=None): """ View that checks the hash in a password reset link and presents a form for entering a new password. """ UserModel = get_user_model() assert uidb64 is not None and token is not None # checked by URLconf if post_reset_redirect is None: post_reset_redirect = reverse('password_reset_complete') else: post_reset_redirect = resolve_url(post_reset_redirect) try: # urlsafe_base64_decode() decodes to bytestring on Python 3 uid = force_text(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 token_generator.check_token(user, token): validlink = True title = ('Enter new password') if request.method == 'POST': form = set_password_form(user, request.POST) if form.is_valid(): form.save() return HttpResponseRedirect(post_reset_redirect) else: form = set_password_form(user) else: validlink = False form = None title = ('Password reset unsuccessful') context = { 'form': form, 'title': title, 'validlink': validlink, } if extra_context is not None: context.update(extra_context) if current_app is not None: request.current_app = current_app return TemplateResponse(request, template_name, context)
urls.py代码
urlpatterns = [ path('password_reset/', views.password_reset, name='password_reset'), path('password_reset/done/', views.password_reset_done, name="password_reset_done"), path('reset/MTU/set-password/', views.password_reset_confirm, name="password_reset_confirm") ]
问题原因与修复方案
问题出在urls.py的路由配置上:当前password_reset_confirm的路由是硬编码的静态路径reset/MTU/set-password/,没有动态接收uidb64和token参数,导致视图函数的这两个参数为None,触发断言错误。
修改urls.py,将路由改为动态参数形式:
urlpatterns = [ path('password_reset/', views.password_reset, name='password_reset'), path('password_reset/done/', views.password_reset_done, name="password_reset_done"), path('reset/<uidb64>/<token>/', views.password_reset_confirm, name="password_reset_confirm") ]
这样邮件中的动态链接(包含uidb64和token)就能正确匹配路由,将参数传递到视图函数,断言条件得以满足,页面即可正常加载。
内容的提问来源于stack exchange,提问作者tiberhockey
相关产品推荐
相关产品推荐

