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

如何在JavaScript的JSON Fetch请求中添加CSRF Token?

在JavaScript Fetch请求中添加Django CSRF Token的正确方式

核心原因

你之前在表单里加csrfmiddlewaretoken没用,是因为Fetch请求不会自动携带表单里的隐藏域参数——除非你把整个表单数据用FormData对象传递。如果是手动构造JSON或者自定义请求体,必须手动把CSRF Token加到请求头或者请求体里。

步骤1:获取CSRF Token

Django提供了两种可靠的获取方式:

方式A:从页面meta标签获取

先在HTML页面里添加meta标签(可通过Django模板标签生成):

<meta name="csrf-token" content="{% csrf_token %}">

然后用JS获取:

const csrfToken = document.querySelector('meta[name="csrf-token"]').content;

方式B:从Cookie中获取

Django默认会给已登录用户(或访问过带CSRF保护页面的用户)设置csrftoken Cookie,直接用JS读取:

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();
            // 判断是否是目标cookie
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
const csrfToken = getCookie('csrftoken');

步骤2:在Fetch请求中携带Token

分两种请求场景:

场景1:发送表单数据(FormData)

如果你的请求是提交表单数据,可以直接把csrfmiddlewaretoken加到FormData里:

const form = document.getElementById('your-form');
const formData = new FormData(form);
// 如果表单里没自动添加,手动补充
formData.append('csrfmiddlewaretoken', csrfToken);

fetch('/post', {
    method: 'POST',
    body: formData
});

场景2:发送JSON数据

如果是发送JSON格式的请求体,必须把Token放到X-CSRFToken请求头里:

fetch('/post', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'X-CSRFToken': csrfToken
    },
    body: JSON.stringify({
        // 你的请求数据
        key: 'value'
    })
});

关键注意事项

  • 确保请求的域名和Cookie的域名一致,避免跨域问题(Django的CSRF保护默认不允许跨域,除非配置了CSRF_TRUSTED_ORIGINS)
  • 如果是React等单页应用,建议封装全局Fetch工具函数,统一添加CSRF Token,避免重复代码
  • 不要直接硬编码Token,必须从页面或Cookie动态获取,因为Token会定期刷新

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 12:27:12