0

我最近发布了一个类似的问题。我在 django 应用程序中使用 $post jquery 表单时遇到问题。它显示 403 错误。

在我之前的帖子中,通过提供的答案,我缩小了可能的错误范围,并帮助我找到了一个有类似问题的帖子。

那个帖子的作者和我有同样的问题。但是,投票最多的答案对我不起作用。相反,这样做的是这个:

//Everything works if I add the 
//"csrfmiddlewaretoken: '{{ csrf_token }}'"
//in the data sent to the server.

function test_post(){ 
  $.post("/xhr_test/", {
      name: "Monty",
      food: "Spam",
      csrfmiddlewaretoken: '{{ csrf_token }}'
  },
      function(data) {
          alert(data);
      }

  ); 
};

虽然它有效,但我不喜欢这个解决方案,因为我必须将“csrfmiddlewaretoken”添加到我发送的所有字符串中。

我想了解为什么投票最多的解决方案对我不起作用,因为我认为它是一个更优雅的解决方案。也就是说,添加这些代码行:

$.ajaxSetup({ 
     beforeSend: function(xhr, settings) {
         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;
         }
         if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
             // Only send the token to relative URLs i.e. locally.
             xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
         }
     } 
});

我认为它必须与“(!(/^http:.*/.test(settings.url)”部分有关。可能需要在那里改变一些东西,但不确定是什么。

4

1 回答 1

0

首先,确保您的 cookie 已启用,这是因为在此方法中,csrftoken 是从 cookie 值中获取的,而不是从模板中获取的。

然后,尝试在 Chrome 开发控制台中粘贴 get_cookie 函数的代码,然后尝试 getCookie('csrftoken')。

如果它返回一个 csrftoken,那么 cookie 就在那里。

接下来,您需要确保那里调用了 ajaxSetup 的代码。在该行之前放置一个debugger语句,如下所示:

 debugger 
 if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {

并单步执行代码以查看它是否正确设置了标题。

尝试官方文档中的那个可能是个好主意。

于 2013-01-16T11:58:13.000 回答