You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:10:29