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

Django切换AJAX后出现CSRF_TOKEN上下文缺失警告求助

解决Django AJAX请求中{% csrf_token %}警告的方案

1. 修正模板片段的渲染方式

如果AJAX加载的是模板片段,必须确保渲染时传入request对象:

  • 错误示例:使用render_to_string时未传request,导致csrf_token上下文缺失
    # 错误写法
    html = render_to_string('your_fragment.html')
    
  • 正确示例:
    from django.template.loader import render_to_string
    
    def your_ajax_view(request):
        # 传入request参数,自动带入csrf_token上下文
        html = render_to_string('your_fragment.html', request=request)
        return HttpResponse(html)
    
  • 更简便的方式是直接用render函数,它默认使用RequestContext:
    from django.shortcuts import render
    
    def your_ajax_view(request):
        return render(request, 'your_fragment.html')
    

2. 确保AJAX请求正确携带CSRF令牌

方式1:手动在请求数据中加入令牌

先从页面的csrf_token标签中取值,再传入AJAX请求:

// 获取页面中的csrf令牌
const csrfToken = document.querySelector('[name=csrfmiddlewaretoken]').value;

// 发起AJAX请求
fetch('/your_api_url/', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
  },
  body: new URLSearchParams({
    csrfmiddlewaretoken: csrfToken,
    // 其他请求参数
    key1: 'value1',
    key2: 'value2'
  })
})
.then(response => response.json())
.then(data => console.log(data));

方式2:配置全局AJAX自动携带令牌(jQuery为例)

如果用jQuery,可以全局设置让所有POST请求自动带上CSRF头:

// 获取csrf令牌
const csrfToken = $('[name=csrfmiddlewaretoken]').val();

// 全局AJAX设置
$.ajaxSetup({
  beforeSend: function(xhr) {
    xhr.setRequestHeader('X-CSRFToken', csrfToken);
  }
});

// 后续发起AJAX请求时无需手动携带
$.post('/your_api_url/', { key1: 'value1' }, function(data) {
  // 处理响应
});

3. 检查项目配置项

  • 确认settings.py的MIDDLEWARE列表中包含django.middleware.csrf.CsrfViewMiddleware,该中间件默认启用,若被注释需恢复。
  • 确认TEMPLATES配置的OPTIONS.context_processors中包含django.template.context_processors.csrf,默认配置已包含,若自定义过context_processors需检查。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 14:37:21