已添加CSRF Token仍报错?Django CSRF问题求助
解决Django中「CSRF token missing or incorrect」错误的排查思路
嘿,我来帮你揪出这个CSRF错误的根源!你已经在模板里加了{% csrf_token %},但还是触发了错误,大概率是自定义提交逻辑或者Cookie设置出了问题,我给你列几个最可能的排查方向:
1. 重点检查自定义的submitForm()函数
你的提交按钮绑定了onclick="submitForm()",如果这个函数是用JavaScript手动处理表单提交(比如AJAX请求),而非依赖浏览器默认提交行为,那很可能没有携带CSRF token。
Django生成的CSRF token存放在名为csrfmiddlewaretoken的隐藏input中,浏览器默认提交会自动带上,但自定义JS提交需要手动处理:
- 如果你用原生JS/Fetch提交,要确保带上token:
function submitForm() { const form = document.getElementById('contact-form'); const csrfToken = document.querySelector('[name=csrfmiddlewaretoken]').value; const formData = new FormData(form); fetch(form.action, { method: form.method, body: formData, headers: { // 必须添加这个请求头 'X-CSRFToken': csrfToken } }) .then(response => { // 处理响应逻辑 }) .catch(error => { console.error('提交出错:', error); }); // 阻止默认提交行为,避免重复提交 event.preventDefault(); } - 更简单的方案:直接删掉按钮的
onclick="submitForm()"属性,让浏览器用默认表单提交行为,这样会自动带上CSRF token,很多时候这就能解决问题。
2. 确认CSRF Cookie是否正常设置
打开浏览器开发者工具(F12),切换到「Application」(Chrome)或「Storage」(Firefox)标签,检查是否存在名为csrftoken的Cookie:
- 如果没有这个Cookie,说明Django的CSRF中间件未正常工作。请确认
settings.py中已包含django.middleware.csrf.CsrfViewMiddleware(默认启用),且本地开发时不要将CSRF_COOKIE_SECURE设为True(该配置要求HTTPS环境才会发送Cookie)。
3. 显式设置表单的action属性
你的表单未指定action,默认提交到当前页面URL,这本身没问题,但如果路由配置有特殊逻辑或存在重定向,可能导致token不匹配。可以显式将action设为视图对应的URL:
<form id="contact-form" name="contact-form" method="post" action="{% url 'collaboratori_commessa' %}">
(请替换collaboratori_commessa为你URLconf中该视图的实际名称)
4. 验证视图是否接收到CSRF token
在视图函数中添加调试代码,确认POST请求是否携带了CSRF token:
def collaboratori_commessa(request): collaboratori_commessa=AltriCosti.objects.all() if request.method == 'POST': # 打印token,确认是否收到 print("CSRF Token received:", request.POST.get('csrfmiddlewaretoken')) form = ModCollaboratoriForm(request.POST) # ... 后续代码
如果打印结果为None,说明表单提交时确实未携带token,回到第一步排查JS提交逻辑即可。
内容的提问来源于stack exchange,提问作者Federico De Marco
相关产品推荐
相关产品推荐

