2014-06-17 33 views
0

试图做一个帖子在阿贾克斯与Tastypie时,我得到一个401。我可以将GET记录到控制台,并使用相同的身份验证。我该如何调试?我的tastypie POST请求有什么问题?

这里是我的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质询时,因为我认为这会有所帮助,但它不是。它有更多的上下文,即关于我用于身份验证的内容,但如果需要,我可以提供更多的细节。

+0

刚作为猜测,REST端点可能没有设置为允许POST请求。我不知道它如何与TasteyPie一起工作,但这就是它与DRF一起工作的方式。 – OozeMeister

回答

0

401通常意味着你无权访问该资源,或者是有CSRF问题。

两件事情映入脑海

  1. 您没有通过认证。您登录(SessionAuthentication),或者是你发送的用户名和API密钥您的要求(ApiKeyAuthentication)。

  2. 如果第1条是没有问题的,那么也许这是因为CSRF令牌尚未确定。 Django不会为所有请求设置令牌。从docs -

如果你的观点并没有渲染包含csrf_token模板标签模板,Django的,还没有设置CSRF令牌的cookie。在表单动态添加到页面的情况下这很常见。为了解决这个问题,Django提供了一个强制设置cookie的视图装饰器:ensure_csrf_cookie()

我在猜测#2更像是情景。您可以将您的视图包装在装饰器中,或者使用中间件为所有请求执行此操作。或者你可以用于身份验证的API密钥,因为它看起来并不像它会检查CSRF令牌(真的不知道,但我看tastypie代码,我没有看到任何CSRF检查。)