使用Ajax加载资源失败:Django模型数据访问403错误求助
解决Django中Ajax POST请求403 Forbidden的问题
嘿,这个403错误太常见啦!你遇到的问题是Django自带的CSRF(跨站请求伪造)保护机制在拦截你的请求——Django会默认拒绝没有携带有效CSRF令牌的POST请求,这是为了防止恶意网站冒充用户提交操作,属于安全防护的正常行为~
下面给你两种最常用的解决办法,选一种适合你的就行:
方法一:通过模板渲染的CSRF令牌提交请求
这种方法适合你的页面是用Django模板渲染的情况:
- 首先在你的HTML模板里,任意位置添加Django的CSRF模板标签:
{% csrf_token %}
这个标签会自动生成一个隐藏的input元素,里面包含了当前会话的CSRF令牌值,比如:
<input type="hidden" name="csrfmiddlewaretoken" value="your_csrf_token_here">
- 然后在你的jQuery Ajax代码里,获取这个令牌并放到请求的请求头中:
// 获取页面中的CSRF令牌 const csrftoken = $('[name=csrfmiddlewaretoken]').val(); // 发起POST请求 $.ajax({ url: '/a_solution/', type: 'POST', // 把CSRF令牌放到请求头里 headers: { 'X-CSRFToken': csrftoken }, // 这里填你要提交给后端的数据 data: { 'param1': 'your_data_here' }, success: function(response) { // 请求成功后的逻辑,比如处理后端返回的模型字符串数据 console.log('拿到的数据:', response); }, error: function(xhr, status, err) { console.log('请求出错:', err); } });
方法二:从Cookie中获取CSRF令牌
如果你的页面没有用Django模板(或者不方便用模板标签),可以直接从浏览器Cookie中获取CSRF令牌——Django默认会把令牌存在名为csrftoken的Cookie里:
- 先写一个获取Cookie的小函数:
function getCSRFCookie(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; }
- 然后在Ajax请求中使用这个令牌:
const csrftoken = getCSRFCookie('csrftoken'); $.ajax({ url: '/a_solution/', type: 'POST', headers: { 'X-CSRFToken': csrftoken }, data: { // 你的请求数据 }, success: function(res) { // 处理返回的模型数据 } });
额外提醒
别想着用@csrf_exempt装饰器跳过CSRF检查哦,除非你的接口是给第三方调用的API(那时候应该用Token认证之类的方案),关闭CSRF保护会带来安全风险,尽量用上面的正规方式解决~
内容的提问来源于stack exchange,提问作者ankuselfie
相关产品推荐
相关产品推荐

