簡體   English   中英

帶有mod_wsgi和gzip的Django

[英]Django with mod_wsgi and gzip

我正在使用Django作為Rest Server。 我想得到一個包含我應該解析的JSON的POST。 客戶端是一個正在壓縮請求的Salesforce服務器。

為了使請求膨脹,我在VHost中使用了它:SetInputFilter DEFLATE

幾乎所有內容看起來都很好,但是當我讀取request.body或request.read(16000)時-輸入的內容很小-我總是看到響應中斷(缺少5個字符)。

有什么建議從哪里開始調試?

從技術上講,WSGI規范不支持將輸入過濾器更改為中間件,甚至不支持底層Web服務器。

特定的問題是,更改輸入過濾器將更改請求內容的數量,但不會更改WSGI環境字典中的CONTENT_LENGTH值。

WSGI規范說,僅允許有效的WSGI應用程序從請求內容中讀取多達CONTENT_LENGTH個字節。 結果,在壓縮請求內容的情況下,最終請求大小最終將大於CONTENT_LENGTH指定的大小,因此Web框架很可能在讀取所有數據之前截斷請求輸入。

您可以在以下位置找到有關此問題的一些詳細信息:

盡管要求更改規范,但沒有任何反應。

要解決此問題,您需要做的是實現一個WSGI中間件,將其包裝在Django應用程序中,如果它通過傳遞的標頭檢測到該內容,則原始內容已被壓縮,但是您知道Apache已解壓縮它會讀取所有請求內容,直到到達流標記的末尾,忽略CONTENT_LENGTH,甚至將請求傳遞給Django。 完成此操作后,可以更改CONTENT_LENGTH並將wsgi.input替換為替換流,然后返回已讀取的內容。

由於內容的大小可能很大,並且大小未知,因此將其全部讀取到內存中不一定是一個好主意。 因此,您可能希望一次讀取一個塊並將其寫出到臨時文件中。 然后,將wsgi.input替換為臨時文件上的打開文件句柄,並將CONTENT_LENGTH替換為文件的最終大小。

如果您在Google網上論壇上的mod_wsgi檔案庫中進行了正確的搜索,則應該在此之前進行討論,甚至可以找到示例代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM