2013-10-25 28 views
12

Since Django 1.5 raw post data is accessible via request.body.例外:您無法從請求的數據流

閱讀在我的應用我有時會得到的數據通過一種形式,有時是原始數據(JSON例如)發送後進入身體。 有沒有什麼辦法可以寫出這樣的函數不會失敗?

def get_post_var(request, name): 
    result = request.POST.get(name) 
    if result: 
     return result 

    post_body = dict(urlparse.parse_qsl(request.body)) 
    result = post_body.get(name) 
    if result: 
     return result 

    return None 
+0

你是什麼意思「有時簡單的數據」的意思。如果它的POST請求,django將負責填充request.POST,而不管數據是通過表單提交還是通過curl或其他方式提交。 –

+1

我的意思是非形式的數據(例如json)如下所述: https://docs.djangoproject.com/en/1.5/ref/request-response/#django.http.HttpRequest.POST – kev

回答

15

錯誤You cannot access body after reading from request's data stream將上一個請求被觸發,如果(1),該請求的方法是POST,(2),該請求的POST字典在中間件訪問,在任一process_requestprocess_view和(3)內的圖功能,request.body被訪問。 (3)錯誤會被提高,即使錯誤的真正原因是(2)。

爲了解決這個錯誤,你需要檢查你的中間件在哪裏訪問request.POST並修改它,使它不再訪問request.POST

Django文檔說middleware should not access request.POST,這是忽略該建議的一個後果。

還檢查了this Django ticket on the issue,其中包括注:

[M] iddleware擊中request.POST應(通常)被認爲是 錯誤。這意味着該視圖將無法設置任何自定義上傳處理程序,執行對請求正文的自定義分析,或在文件上傳被接受之前強制執行 權限檢查。

+9

它應該被添加這不僅適用於'request.POST',也適用於'request.body'。 – gregoltsov

5

添加到亞當·伊斯特林的回答很值得指出的是Django的「violates」的中間件使用request.POST提示:

的CsrfViewMiddleware類可以被認爲是一個例外,因爲它 提供了csrf_exempt()和csrf_protect()修飾器,允許 視圖明確地控制CSRF驗證發生在哪一點。

這並不sanitilize違反IMO

+1

事實上,這對我來說是一個煩惱。解決方案/解決方法是使用PUT而不是POST,如果你的意思是讀取請求體(除了通過POST/FILES)。 –

相關問題