2011-09-12 35 views
4

我們有一個Django應用程序需要發佈消息並通過XML API將文件從Web服務器上傳到另一個服務器。我們需要執行X異步文件上傳,然後在完成上傳時創建另一個XML API請求。我還希望這些文件能夠從磁盤進行流式傳輸,而無需先將這些文件完全加載到內存中。最後,我需要在POST主體(而不是更典型的表單數據MIME類型)中將應用程序發送爲application/octet-stream,並且我無法找到使用urllib2或httplib執行此操作的方法。使用Twisted從Django應用程序異步文件上傳

我最終將Twisted集成到應用程序中。對於這個任務來說,這看起來很完美,當然,我能夠爲每次上傳寫一個漂亮乾淨的實現,並帶有延遲。我使用我自己的IBaseProducer以文件塊的形式讀取數據,並將其發送到POST請求體中的服務器。不幸的是,我發現Twister反應堆不能重新啓動,所以我不能只運行它,然後每當我想上傳文件時停止它。由於Twisted顯然更多地用於成熟的服務器,我現在想知道這是否是正確的選擇。

我不確定我是否應該: a)配置WSGI容器(目前我正在使用manage.py進行測試)在啓動時啓動Twisted線程並使用blockingCallFromThread觸發我的文件上傳。 b)使用Twisted作爲Django應用程序的WSGI容器。我假設我們希望稍後部署在Apache上,並且我不確定如果我們採用此路線會產生什麼影響。 c)只需扭曲並使用其他一些方法進行文件上傳。由於具有延遲的Twisted方法是優雅且有效的,因此這種羞恥感非常有效。

我們應該選擇哪一種,還是有其他的選擇?

回答

1

爲什麼要稍後部署Apache?扭曲是拉德。我會做(b)直到有人提出具體的,令人信服的理由不要。然後我會做(一)。幸運的是,您的應用程序代碼看起來都一樣。 blockingCallFromThread可以正常工作,不管Twisted是否是你的WSGI容器 - 無論哪種方式,你只是在一個單獨的線程中處理運行代碼,而不是運行反應堆。

+0

如果Apache需要混合使用其他一些原因,反向代理是一個選項。既可以將Apache作爲前端運行,也可以使用Twisted的ReverseProxyResource對象來反向代理正在使用的Apache組件。這樣,你可以在Twisted的WSGI容器中部署Django,但是仍然使用Apache來處理*,而無需使用'mod_wsgi'。 – Glyph