使用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
相关产品推荐
相关产品推荐

