2013-04-15 98 views
2

我通過$.ajax()發送一個POST請求到一個來自HTTP頁面的Django視圖 - 我使用了AJAX片段提供的CSRF here。我可以在Firebug中查看csrftoken cookie爲Secure;我想這就是爲什麼POST請求的X-Csrftoken標題被髮送爲null發送一個jQuery POST到Django視圖

有沒有什麼辦法可以實際訪問這個cookie的值?我目前正在繞過403錯誤(因爲POST正在發送一個空的CSRF標記頭),所以在我的視圖中添加了@csrf_exempt - 但是想要一個適當的CSRF方法。

更新爲清晰度:我是不是通過表格提交此數據。我只是在頁面上加載一個JavaScript文件(包含AJAX調用)時發送POST。

回答

3

我爲獲得準備恰當的CSRF的解決方案做的是這樣的:

包括我{% csrf_token %}在一個地方,這是有道理的。

var csrfToken = $('input[name="csrfmiddlewaretoken"]').val(); 
$.ajax({ 
    url: $form.attr('action'), 
    type: 'POST', 
    data: postData, 
    csrfmiddlewaretoken: csrfToken, 
    dataType: 'json', 
    success: function(data) { } 
}); 

我一直在努力得到這個工作:

var csrftoken = $.cookie('csrftoken'); 
$.ajaxSetup({ 
    beforeSend: function(xhr, settings) { 
     xhr.setRequestHeader("X-CSRFToken", csrftoken); 
    } 
}); 

但迄今爲止第一個解決方案已被證明是效果最好的一個。

+0

在您的示例中,'csrfmiddlewaretoken'是表單中的隱藏字段。然而,在我的情況下,我在頁面加載時發送這個POST請求(在加載包含'$ .ajax()'的JS時立即調用) - 即沒有表單。我的情況如何? – GPX

+0

如果我理解正確,那麼您必須在視圖「before」前呈現csrf_token,並使用「GET」請求發送該視圖。或者如果這對你來說是不可能的,那麼你可以用一個在你的請求中「注入」csrf_token的中間件來做。 –

+0

是的,'csrf_token'已經可用。我只是嘗試在AJAX調用中添加'csrfmiddlewaretoken',如第一個示例中所示,它起作用!這是記錄的嗎? – GPX

相關問題