如何解决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
相关产品推荐
相关产品推荐

