【问题标题】:Django jquery ajax 403 errorDjango jquery ajax 403 错误
【发布时间】:2011-11-30 14:23:11
【问题描述】:

我正在尝试让 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= '<table id="inv_prod_list" style="border: 2px solid #dddddd;"></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
                   }
        });
    }
});

【问题讨论】:

  • 使用 Firebug(Firefox 扩展)(或其他 Javascript 控制台)查看 403 背后的原因。然后你会看到 Django 错误页面(带有关于 CSRF 令牌的有用提示)。

标签: jquery ajax django json


【解决方案1】:

the HTTP/1.1 Status Code Definitions。 “403”是状态码“禁止”。这是在您的 $.ajax 请求的服务器端引发的错误,而不是在客户端(即您的代码正在发出请求,但来自服务器的响应是错误消息)。

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

服务器理解请求,但拒绝执行。授权将无济于事,并且不应重复请求。如果请求方法不是 HEAD 并且服务器希望公开请求未完成的原因,它应该在实体中描述拒绝的原因。如果服务器不希望向客户端提供此信息,则可以使用状态代码 404(未找到)来代替。

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

【讨论】:

  • 这不是问题。我已尝试删除所有用户验证要求,但仍然抛出相同的错误。
【解决方案2】:

我想你don't pass CSRF token

【讨论】:

  • 是的,这正是问题所在,谢谢!我所要做的就是将官方文档中的那段代码复制到一个 js 文件中,并将其包含在我的 html 中。
【解决方案3】:

我遇到了这个问题,我想我会发布发生了什么。我在缓存页面中有{% CSRF_TOKEN %},它正在缓存它放在那里的内容。因此,对于某些用户来说它是有效的,而有些则不依赖于缓存!追踪它是一场噩梦,即使它应该很明显......所以检查你的缓存。

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      【解决方案6】:

      只需将 the official docs 中的那段代码复制到一个 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);
              }
          }
      });
      

      【讨论】:

        猜你喜欢
        • 2021-02-13
        • 1970-01-01
        • 2013-03-21
        • 2011-12-14
        • 2011-09-06
        • 2011-10-08
        • 2016-11-06
        • 2017-12-23
        • 2015-12-12
        相关资源
        最近更新 更多