2011-05-28 59 views
0

我在使用POST數據而不是使用Django的GET數據時遇到了問題。使用POST方法的Django問題

這裏是我的簡單的URL模式類:

urlpatterns = patterns('', 
    ('^hello/$', hello), 
    ('^hello/ajax_info/$', ajax_info), 
) 

而且我在views.py文件這樣的觀點:

def ajax_info(request): 
    if request.method == "POST": 
     print "This is a post" 
    # do stuff  

的網頁擔任了當您瀏覽/你好/有此javascript其中:

function loadXMLDoc(name) { 
     if (window.XMLHttpRequest) { 
      // code for IE7+, Firefox, Chrome, Opera, Safari 
      xmlhttp=new XMLHttpRequest(); 
     } else { 
      // code for IE6, IE5 
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
     } 

     xmlhttp.onreadystatechange=function(){ 
      if (xmlhttp.readyState==4 && xmlhttp.status==200) { 
       document.getElementById("myDiv").innerHTML=xmlhttp.responseText; 
       //window.onload() 

      } 
     } 

     // GET method 
     //parm = values 
     //xmlhttp.open("GET",name+"?q="+parm, true); 
     //xmlhttp.send(); 

     // POST method 
     parms = "data=" + values 
     xmlhttp.open("POST", "ajax_info", false); 
     xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded") 
     xmlhttp.send(parms) 
    } // end function loadXMLDoc 

(在網頁中我有一個按鈕,導致loadXMLDoc()被調用,當你按下它)

如果我取消註釋JavaScript中的「GET方法」,並註釋掉「POST方法」,那麼我的django視圖被調用。

但是,如果我註釋掉「GET方法」並使用「POST方法」代碼,那麼我的查看器甚至不會被調用。和Django的開發服務器返回此:

[28/May/2011 00:15:06] "POST /hello/ajax_info HTTP/1.1" 500 69236 

我是否缺少明顯的東西?這些示例似乎表明,即使我們的請求是POST,我的請求也應該發送給我的查看者。

+0

以及在javascript中打開調用的bool參數(在本例中爲false)似乎並不重要。 true也不起作用,結果相同。 – 2011-05-28 04:37:26

回答

2

我相信問題是你的視圖方法不會返回任何東西......嘗試訪問頁面/你好/ ajax_info /並檢查是否一切正常工作!

如果是這種情況,您將收到DEBUG = True的錯誤: 「視圖...沒有返回HttpResponse對象。」

如果您正在發佈內容,請確保您使用的是「csrf_token」標記... Cookie必須已啓用!

+0

當我發佈POST時,我的view方法甚至沒有被Django調用。如果我按照你的建議直接訪問頁面,它就會工作(因爲這是一個GET,我猜) – 2011-05-28 11:59:35

+0

好的,然後嘗試在頁面上發佈一些東西,而不需要Ajax ...一個簡單的表單就可以了!如果它適用於GET,那麼這個錯誤就是用POST方法生成的......但是如果它沒有打印出「這是一篇文章」的消息,那麼一些東西就會死亡!我的直覺是CSRF保護...https://docs.djangoproject.com/zh/dev/ref/contrib/csrf/ – StefanNch 2011-05-28 15:41:21

2

我對django不太熟悉,但那個500肯定看起來像一個HTTP狀態碼,表明你的迴應是壞的。也許看看JavaScript調試器會發生什麼:Firebug,Chrome的工具,Opera Dragonfly等。

順便提一句,您可能想要爲客戶端代碼使用像jQuery這樣的庫。手動ajax是一個巨大的頭痛。

1

我記得在某些時候,我有一個問題,當我強制URL以「/」結尾時,POST和ajax無法正常工作。我想這是值得一試,嘗試並刪除它。

urlpatterns = patterns('', 
    ('^hello/$', hello), 
    ('^hello/ajax_info$', ajax_info), # Removed ending slash 
) 
+0

這並沒有解決它,但它確實將HTTP響應錯誤代碼從500更改爲403。 – 2011-05-28 11:58:37