Django jquery ajax 403错误

我想让ajax工作,但我一直收到403错误。 我对jquery很新。

以下是我的代码

$('#prod_search_button').click(function(){ if ($('#inv_prod_list').length) { //insert a new record } else { //create the #inv_prod_list table and insert first record var inv_table= '
'; // create query object var prod_query = { query: jQuery.trim($('#id_prod_query').val()) }; // convert object to JSON data var jsonQuery = JSON.stringify(prod_query); $.ajax({ type: 'POST', url: '/company/product/item_search.json/', data: jsonQuery, success: function(jsonData){ var parsed = JSON.parse(jsonData); $('#inv_prod_wrap').html(inv_table); var new_record = 'this is html for new row' $('#inv_prod_list tr:last').after(new_record); //off rows alt color } }); } });

我认为你没有通过CSRF令牌 。

您可以通过在方法定义之前添加以下注释来避免CSRF。

 from django.views.decorators.csrf import csrf_exempt @csrf_exempt def Method(): 

只需将官方文档中的那段代码复制到js文件中,并将其包含在您的html中

 // using jQuery function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie !== '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = jQuery.trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) === (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } var csrftoken = getCookie('csrftoken'); function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } $.ajaxSetup({ beforeSend: function(xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken", csrftoken); } } }); 

请参阅HTTP / 1.1状态代码定义 。 “403”是状态代码“Forbidden”。 这是在$.ajax请求的服务器端抛出的错误,而不是客户端(即您的代码正在发出请求,但来自服务器的响应是错误消息)。

该文档表明服务器应仅在特定情况下响应该错误:

服务器理解请求,但拒绝履行请求。 授权无效,请求不应重复。 如果请求方法不是HEAD并且服务器希望公开为什么请求没有得到满足,那么它应该描述实体中拒绝的原因。 如果服务器不希望将此信息提供给客户端,则可以使用状态代码404(未找到)。

通常,此类错误意味着您登录的任何用户都无权访问您请求的URL。 通常,这表示代码中唯一的错误是您发出请求的URL或一系列调用的顺序(例如,您在登录前尝试请求数据)。 不太常见的是,一些Web服务器和Web应用程序被配置为响应所有“无效”请求的403错误代码而不是404(未找到)错误代码,以避免泄漏关于服务器上存在/不存在哪些文件的信息。

我遇到了这个,并且发现我发布了正在发生的事情。 我在缓存的分页中有{% CSRF_TOKEN %} ,它正在缓存它放在那里的内容。 所以对于一些用户来说它是有效的,有些用户不依赖于缓存! 尽管它应该是显而易见的,但追踪它是一场噩梦…所以检查你的缓存。

还可以检查settings.py中是否启用了csrf中间件并禁用它。 寻找'django.middleware.csrf.CsrfViewMiddleware'