Django项目AJAX POST请求CSRF验证失败,无法传递数据求助
Django AJAX POST请求CSRF验证失败问题解决
问题分析
你的代码里有几个关键错误,直接导致CSRF验证失败、数据无法传递到目标视图:
1. AJAX请求URL不匹配
urls.py中defaultpg视图对应的路径是eafterhome/,但你AJAX里硬编码的url: '/defaultpg'完全不对,请求根本到不了目标视图。
2. CSRF Token传递错误
你在data里写的'csrfmiddlewaretoken': $("input[name=csrfmiddlewaretoken]")是获取jQuery对象,不是Token的实际值,必须加.val()来提取Token字符串。
3. 表单默认提交行为未阻止
validateForm函数触发AJAX后没有返回false,导致表单会执行默认的刷新提交,AJAX请求被中断,数据自然传不到后端。
4. 视图返回类型不匹配
AJAX指定了dataType: "json",但视图返回的是redirect('Entry')(HTTP重定向),不符合JSON响应要求,会触发AJAX的error回调,让你误以为请求失败。
修正后的代码
registration.html 修正版
<form method="POST" onsubmit="return validateForm()"> {% csrf_token %} <label for="name">Name:</label> <input type="text" id="name" name="name" required /> <label for="email">Email:</label> <input type="email" id="email" name="email" required /> <label for="password">Password:</label> <input type="password" id="password" name="password" required /> <input type="submit" value="Register" name="createuser"/> </form> <script> let URLd = "{% url 'defaultpg' %}" let nameInput = document.getElementById("name"); let emailInput = document.getElementById("email"); let passwordInput = document.getElementById("password"); function validateForm() { // 正确获取CSRF Token的值 var csrfToken = $("input[name='csrfmiddlewaretoken']").val(); let nameValue = nameInput.value; let emailValue = emailInput.value; let passwordValue = passwordInput.value; let isNameValid = /^[a-zA-Z]+$/.test(nameValue); let isEmailValid = /^\S+@\S+\.\S+$/.test(emailValue); let isPasswordValid = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/.test(passwordValue); if (isNameValid) { if (isEmailValid) { if (isPasswordValid) { $.ajax({ type: "POST", url: URLd, // 使用模板生成的正确URL,避免硬编码错误 data: { "name": nameValue, "email": emailValue, "password": passwordValue, 'csrfmiddlewaretoken': csrfToken // 传递Token实际值 }, dataType: "json", success: function (data) { alert("数据已成功提交!"); // 如果需要跳转,在这里用JS处理:window.location.href = "{% url 'Entry' %}" }, error: function (xhr) { alert("提交失败:" + xhr.responseText); } }); return false; // 阻止表单默认刷新提交 } else { alert("密码必须包含大小写字母、数字,长度不少于8位"); } } else { alert("请输入有效的邮箱地址"); } } else { alert("请输入有效的姓名(仅字母)"); } return false; // 验证失败时也阻止提交 } </script>
views.py 修正版
from django.http import JsonResponse @csrf_protect def defaultpg(request): if request.method == "POST": name = request.POST.get('name') email = request.POST.get('email') password = request.POST.get('password') print("------------------------") print(name) print(email) print(password) print("------------------------") # 返回符合AJAX要求的JSON响应 return JsonResponse({"status": "success"}, status=200)
额外提示
- 确保页面已经加载了jQuery,否则
$符号会报错; - 打开浏览器控制台的「Network」标签,查看AJAX请求的状态码和响应内容,方便快速排查问题;
- 如果需要跳转页面,在AJAX的
success回调里用JS实现,不要让后端返回重定向。
内容的提问来源于stack exchange,提问作者Aryan Bagwe
相关产品推荐
相关产品推荐

