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

使用Dj-rest-auth实现密码重置流程时,rest_password_reset_confirm接口提交请求异常问题

解决Dj-rest-auth密码重置确认时POST请求失败&ContentType错误的问题

你提到跟着官方示例实现密码重置流程,但点击提交后$.post只发GET请求,还一直报ContentType相关错误——我之前帮人排查过好几次这种问题,大概率是表单配置、AJAX事件绑定的细节没处理到位,给你梳理几个关键修复点:

1. 先把表单的基础配置拉到位

首先检查你的密码重置确认表单,这几个点不能错:

  • 必须显式设置method="POST",不然浏览器默认会用GET提交:
    <form id="password-reset-confirm-form" method="POST">
      <!-- 这里放uid、token、新密码、确认密码的输入框 -->
    </form>
    
  • 别乱加enctype="multipart/form-data",这个是给文件上传用的,会直接导致Content-Type不符合后端要求。

2. 修复AJAX事件绑定,阻止默认提交行为

很多时候$.post被GET请求覆盖,都是因为没阻止表单的默认提交行为——浏览器直接走了表单的原生提交,把你的AJAX请求给冲掉了。正确的jQuery代码应该这么写:

$("#password-reset-confirm-form").on("submit", function(e) {
  // 核心:先阻止表单的默认提交动作
  e.preventDefault();

  // 收集表单数据
  const formData = {
    uid: $("#id_uid").val(),
    token: $("#id_token").val(),
    new_password1: $("#id_new_password1").val(),
    new_password2: $("#id_new_password2").val()
  };

  // 用完整配置的方式发起POST请求,明确指定Content-Type
  $.post({
    url: "/api/auth/password/reset/confirm/", // 替换成你的实际端点URL
    data: JSON.stringify(formData),
    contentType: "application/json", // 关键:匹配后端期望的Content-Type
    success: function(res) {
      console.log("密码重置成功!", res);
      // 这里可以加成功后的跳转或提示逻辑
    },
    error: function(xhr) {
      console.error("重置失败:", xhr.responseText);
      // 处理错误提示,比如把后端返回的错误显示给用户
    }
  });
});

这里要注意:

  • 别用$.post的简写($.post(url, data, success)),这种写法没法自定义contentType,容易踩坑;
  • 如果你的后端配置是接受表单编码(application/x-www-form-urlencoded),可以把data改成$(this).serialize(),同时去掉contentType的设置——不过用JSON格式更符合REST API的规范,dj-rest-auth默认也支持。

3. 确保后端端点配置正确

检查你的urls.py里的rest_password_reset_confirm路由配置,必须是绑定了正确的视图类,默认是允许POST请求的:

from dj_rest_auth.views import PasswordResetConfirmView

urlpatterns = [
    # ...其他路由
    path('api/auth/password/reset/confirm/', PasswordResetConfirmView.as_view(), name='rest_password_reset_confirm'),
]

如果你自定义了这个视图,要确保没有限制请求方法(比如没加permission_classes或allowed_methods的错误限制)。

4. 排查ContentType错误的具体原因

如果还是报错,打开浏览器开发者工具(F12)的Network标签,看一下请求的细节:

  • 确认请求Method是POST,而不是GET;
  • 看Request Headers里的Content-Type是不是你设置的(要么application/json,要么application/x-www-form-urlencoded; charset=UTF-8);
  • 另外别忘了CSRF令牌——django默认开启CSRF保护,AJAX请求必须带令牌,你可以在代码里加上这段官方推荐的逻辑:
    // 全局设置AJAX请求的CSRF令牌
    $.ajaxSetup({
      headers: { "X-CSRFToken": getCookie("csrftoken") }
    });
    
    // 辅助函数:获取CSRF Cookie
    function getCookie(name) {
      let cookieValue = null;
      if (document.cookie && document.cookie !== '') {
          const cookies = document.cookie.split(';');
          for (let i = 0; i < cookies.length; i++) {
              const cookie = cookies[i].trim();
              if (cookie.substring(0, name.length + 1) === (name + '=')) {
                  cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                  break;
              }
          }
      }
      return cookieValue;
    }
    

按这几个步骤排查下来,基本就能解决POST请求变成GET、ContentType错误的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:22:37