2017-06-15 71 views
3

我存在的問題是,當向Django服務器發送一些請求時,它會在時間之前關閉連接。Django重置一些請求的連接

這裏是simple project在Github上

下面是它的工作原理與任何機構簡單的POST請求: enter image description here

但是,當我發送一些二進制數據,〜15MB大小,郵差會顯示連接錯誤: enter image description here

捲曲工作正常

curl -X POST -d "@bin/ngrok" localhost:3000/test/ 

我認爲這是Postman中的一些錯誤,但在移動設備上它也不起作用;

我試圖比較請求標頭。我試圖折騰中間件。我嘗試調試Djnago代碼。但我可以找到解決方案。你能幫助我嗎?在settings.py文件

UPDATE 1

設置

FILE_UPLOAD_MAX_MEMORY_SIZE = 1000 * 1000 * 1000 
DATA_UPLOAD_MAX_MEMORY_SIZE = 1000 * 1000 * 1000 

不能解決問題

UPDATE 2

我添加線print(len(request.body))索引方法:

@csrf_exempt 
def index(request): 
    print(len(request.body)) 

    return HttpResponse("Hello") 

現在它的工作。但爲什麼我應該提到身體完成請求? 在我的真實項目中,我檢查身份驗證令牌,如果它是錯誤的,我沒有從身體讀取任何東西。

+0

這是否爲這是幾MB的大小POST請求只發生? – dentemm

+0

我嘗試了大小爲70KB的文件,並且沒問題。我試圖改變DATA_UPLOAD_MAX_MEMORY_SIZE,但沒有幫助 – atomAltera

回答

1

是的,我可以重現這與您的回購。

我看了一下Wireshark,看起來Django devserver實際上在整個有效負載發送之前都響應。我不確定HTTP規範是否說明了這是否正常,但很明顯,一些客戶端庫(Postman和您的移動設備使用的)認爲這是一個錯誤,而其他像libcurl這樣的客戶端庫也可以。

當您添加print(len(request.body))時,它會強制Django(和底層堆棧)在輸出響應之前消耗整個正文以便計算其長度。

在uwsgi下運行應用程序時,也會發生這種行爲,因爲它的價值。

的TCP流看起來像這樣在Wireshark的: enter image description here

+0

好的,謝謝。可能有一些Django配置設置用於防止這種行爲?它看起來醜陋的請求如果我在某些情況下不需要它, – atomAltera

+1

那麼,你可以編寫一箇中間件,強制訪問每個請求中的'request.POST'或'request.body'。儘管說實話,你的應用不應該張貼大的有效載荷到不指望他們的端點,如果你問我:) – AKX

0

幾周前,我在Heroku上的一個項目中遇到了同樣的問題。 Heroku日誌顯示不太有用的「服務器請求中斷」錯誤。經過幾天的調試和調查django源代碼後,我發現它與django's Upload Handlers有關。

有一個名爲FILE_UPLOAD_MAX_MEMORY_SIZE的設置,默認爲2.5Mb。任何小於此設置的上傳都將由MemoryFileUploadHandler(在內存中)處理,否則TemporaryFileUploadHandler負責文件處理。我從來沒有發現爲什麼,但在Heroku上,TemporaryFileUploadHandler總是讓我的應用程序崩潰。我通過將設置增加到客戶端要上傳的最大文件大小來創建解決方法。

+0

不幸設置FILE_UPLOAD_MAX_MEMORY_SIZE事件高達1000000000沒有解決問題; – atomAltera

+0

請參閱更新1 – atomAltera

+0

太糟糕了:-(比我都想出來的想法恐怕... – dentemm