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

如何解决Django重置密码确认页面的404错误?

解决DRF重置密码链接404错误的步骤

以下是针对你的问题的具体排查和修复方案:

  • 检查URL路由匹配规则
    你的请求URL为/reset-password/MjE/cbr2cj-0d6c660c151de4e79594212801241fed/,需确保项目URL配置能正确捕获uidb64和token参数,且路径结构完全匹配。示例配置如下:

    from django.urls import path
    from .views import PasswordResetConfirmView
    
    urlpatterns = [
        # 其他路由
        path('reset-password/<uidb64>/<token>/', PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
    ]
    

    注意:路径末尾的斜杠要与邮件生成的链接保持一致,参数名<uidb64>和<token>需与视图接收的参数名完全对应。

  • 确认视图类的参数解析逻辑
    若使用自定义视图,需确保能正确解码uidb64并验证令牌,且关联你的Account模型而非默认User模型:

    from django.contrib.auth.tokens import default_token_generator
    from django.utils.http import urlsafe_base64_decode
    from django.utils.encoding import force_str
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from .models import Account
    
    class PasswordResetConfirmView(APIView):
        def get(self, request, uidb64, token):
            try:
                uid = force_str(urlsafe_base64_decode(uidb64))
                user = Account.objects.get(pk=uid)
            except (TypeError, ValueError, OverflowError, Account.DoesNotExist):
                user = None
    
            if user and default_token_generator.check_token(user, token):
                return Response({"status": "success", "message": "令牌有效,请重置密码"})
            else:
                return Response({"status": "error", "message": "无效的令牌或用户"}, status=400)
    

    若使用Django原生视图,需确保继承django.contrib.auth.views.PasswordResetConfirmView并适配DRF的需求。

  • 校验邮件链接的生成逻辑
    生成重置链接时,需使用与路由配置一致的name参数,确保路径生成正确:

    from django.utils.http import urlsafe_base64_encode
    from django.utils.encoding import force_bytes
    from django.contrib.auth.tokens import default_token_generator
    from django.urls import reverse
    
    def send_reset_password_email(user):
        uidb64 = urlsafe_base64_encode(force_bytes(user.pk))
        token = default_token_generator.make_token(user)
        # 调用reverse时使用路由配置的name值
        reset_path = reverse('password_reset_confirm', kwargs={'uidb64': uidb64, 'token': token})
        full_reset_url = f"http://127.0.0.1:8000{reset_path}"
        # 发送邮件逻辑
    
  • 验证根路由是否包含应用路由
    若重置密码路由定义在应用的urls.py中,需确保项目根urls.py已引入该应用路由:

    from django.urls import path, include
    
    urlpatterns = [
        path('', include('your_account_app.urls')),  # 替换为你的应用名称
        # 其他根路由
    ]
    
  • 排查令牌有效性
    若路由匹配正常但仍返回404,可能是令牌过期(默认有效期3天)或用户在生成链接后修改过密码。可在视图中添加日志排查解码和验证过程:

    import logging
    logger = logging.getLogger(__name__)
    
    class PasswordResetConfirmView(APIView):
        def get(self, request, uidb64, token):
            logger.info(f"接收参数:uidb64={uidb64}, token={token}")
            try:
                uid = force_str(urlsafe_base64_decode(uidb64))
                logger.info(f"解码后的用户ID:{uid}")
                user = Account.objects.get(pk=uid)
                logger.info(f"找到用户:{user.email}")
            except Exception as e:
                logger.error(f"获取用户失败:{str(e)}")
                user = None
            # 后续验证逻辑
    

内容的提问来源于stack exchange,提问作者mightycode Newton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:15:03