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

已添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:22:33