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
相关产品推荐
相关产品推荐

