2014-06-17 30 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檢查。)