2012-07-16 33 views
2

我正在運行django服務器,當我做一個帖子時,我得到一個403消息。我的問題是,如下所示做一個JSON調用,我應該運行Apache?否則,我做錯了什麼?在django的json請求403消息

在html頁面中,我只包含最新的jquery文件。

var snddata = {}; 
    snddata["username"] = username; 
    snddata["firstname"] = firstname; 
    snddata["lastname"] = lastname; 
    snddata["usertype"] = $("#usertype").val(); 
    snddata["address"] = address; 
    snddata["emailid"] = emailid; 
    snddata["empid"] = empid; 
    $.post("/home/", snddata, 
    function callbackHandler(data, textstatus) 
    { 
    if (data.status == 1) 
    { 
     alert("User added successfully"); 
    } 
    else 
    { 
     alert(data.msg); 
    } 
    }, 
    "json" 
    ); 

回答

4

Django具有csrf保護功能,您必須爲每個POST請求添加「csrfmiddlewaretoken」。 嘗試添加這行代碼:

snddata["csrfmiddlewaretoken"] = $('input[name=csrfmiddlewaretoken]').val(); 

必須在您的形式插入此標籤,至極返回一個隱藏的輸入字段csrf_token:

{% csrf_token %} 
+0

但我沒有在/ home中看到請求def home(請求):logging.debug(「Got request」)我沒有看到上面的調試語句 \t 我應該包括任何js文件在包含此代碼之後,json調用 – Rajeev 2012-07-16 15:27:39

+0

仍然是相同的問題 – Rajeev 2012-07-16 15:35:09

+0

以這種方式設置snddata [「csrfmiddlewaretoken」]將不起作用,因爲模板標記返回表單輸入元素,而不是所需的標記。 – Alasdair 2012-07-16 15:49:36

2

403錯誤是因爲Django的跨站請求僞造保護(CSRF)保護。

有關更多詳細信息,請參閱Django CSRF docs page,其中包含可用於使jQuery ajax請求起作用的有用片段。

+0

但我沒有看到/ home中的請求我已經定義了def home(request):logging.debug(「Got request」)我沒有看到上面的調試語句 – Rajeev 2012-07-16 15:24:24

+0

我應該包括任何js文件json調用 – Rajeev 2012-07-16 15:27:18

+0

您的調試語句的視圖永遠不會被調用,因爲CSRF中間件先檢查令牌,然後返回403. – Alasdair 2012-07-16 15:30:27

2

要添加到什麼麥金太爾說。

在html頁面的某處添加{% csrf_token %}。並在上面的javascript中添加snddata["csrfmiddlewaretoken"] = $("#csrfmiddlewaretoken").val();

這應該添加一個'輸入'元素與CSRF令牌作爲值。而js部分將在表單中提交。

CSRF令牌對POST請求是必需的,除非視圖具有@csrf_exempt裝飾器或CSRF已被禁用。

響應碼403是一個禁止請求碼。

+0

willfill更新了他的答案。它應該是'$('input [name = csrfmiddlewaretoken]')。val();' – Maqsood 2012-07-16 19:54:31