我的tastypie POST请求有什么问题?

时间:2014-06-17 22:38:06

标签: python django tastypie

我在尝试使用Tastypie在ajax中发帖时得到401。我可以将GET记录到控制台,他们使用相同的身份验证。我该如何调试?

这是我的javascript:

// sending a csrftoken with every ajax request
function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
    crossDomain: true, // obviates need for sameOrigin test
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type)) {
            xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));
        }
    }
});

//this is the get request, which works fine
$.ajax({
   url: "http://localhost:8080/data/api/v1/user/?format=json",
   success: function(data){
console.log(data);
}
});

$(function() {
  $('#newEntry').click(function() {
   var table=$("#entryName").val(); 
   var d = JSON.stringify({
    "name":entry,
    "user":"http://localhost:8080/data/api/v1/user/?format=json"
    });

    $.ajax({
      type: 'POST',
      data: d,
      success: function(r) {console.log(r); },
      error: function(r){console.log(r); },
      url: 'http://localhost:8080/data/api/v1/entry/',
      cache:false
    });
  });
});

我之前问过this问题,因为我觉得它会有所帮助,但它还没有。它有更多的背景,即关于我用于auth的内容,但如果需要,我可以提供更多细节。

1 个答案:

答案 0 :(得分:0)

401通常意味着您无权访问该资源,或者存在CSRF问题。

有两件事让人想起

  1. 您未经过身份验证。您是否已登录(SessionAuthentication),或者是否根据您的请求(ApiKeyAuthentication)发送了用户名和API密钥。

  2. 如果#1不是问题,那么可能是因为尚未设置csrf令牌。 Django没有为所有请求设置令牌。来自docs -

  3.   

    如果您的视图没有呈现包含csrf_token模板标记的模板,Django可能不会设置CSRF令牌cookie。这在表单动态添加到页面的情况下很常见。为解决这种情况,Django提供了一个视图装饰器,它强制设置cookie:ensure_csrf_cookie()

    我猜测#2更像是情景。您可以将视图包装在ensure_csrf_cookie装饰器中,也可以使用中间件为所有请求执行此操作。或者您可以使用api密钥进行身份验证,因为它看起来不像是检查csrf令牌(不是很确定,但我正在查看tastypie代码,我没有看到任何csrf检查。)