2013-04-28 26 views
3

我使用Python開發一個web應用程序,其中的用例之一是使用戶:Python web框架能夠分塊傳輸編碼?

  • 上傳大文件在HTTP POST和

  • 同時下載和顯示響應,這是一個類似大小的文件的處理版本。

客戶端是由我們在C++開發的,但我想使用HTTP。服務器不需要整個文件開始生成響應,它可以在第一個250KB左右到達時開始處理數據。上傳開始和響應的第一部分之間的等待時間應該儘可能低(例如在你使用原始插口可能達到的100毫秒內)

推測這是理想的使用分塊傳輸編碼比多個小HTTP請求?總的請求/響應的長度不能提前知道,但我想它可以分成多個已知大小的請求/響應,是否有一個Web服務器可以愉快地流(而不是緩衝+傳遞)這些塊因爲他們正在上傳?

我聽說過扭曲與分塊傳輸編碼很好,但我更願意使用更傳統的Web框架(如果可能的話),特別是對於我的其他應用程序(在此用例之外並不需要像這樣的任何幻想)。

+0

爲了澄清,以防萬一,我想要一個Web框架,使服務器在下載整個請求之前調用POST處理程序。 – user1478842 2013-04-29 00:57:40

回答

1

WSGI支持這一點,我相信。這裏,我們將呼應不管他們給我們:

def application(environ, start_response): 
    content_type = environ.get('CONTENT_TYPE', 'text/plain') 
    headers = [('Content-Type', content_type)] 
    if 'CONTENT_LENGTH' in environ: 
     headers.append(('Content-Length', environ['CONTENT_LENGTH'])) 
    start_response('200 OK', headers) 
    input = environ.get('wsgi.input') 
    if input is None: 
     yield '' 
     return 
    while True: 
     datum = input.read(4096) # or so 
     if not datum: 
      return 
     yield datum 

Web服務器可以選擇使用各yieldTransfer-Encoding: chunked塊,雖然他們不需要。

+0

我該如何將它與django,燒瓶,金字塔等更高級的框架結合起來? – user1478842 2013-05-01 12:54:43

+1

@ user1478842:大多數這些框架都有WSGI部署選項。如果你可以訪問他們的WSGI應用程序對象,那麼在你的自定義WSGI應用程序對象中,你可以確定你是想自己處理還是傳遞它。如果你想傳遞它,Python 3有一個你可以使用的簡潔的語法:'yield from'。有了它,你可以象'從other_application(environ,start_response)'產生'一樣傳遞。 – icktoofay 2013-05-02 04:31:24

+0

@ user1478842:對於某些框架,如果框架本身足夠低,則甚至可以直接執行此操作,而無需包裝WSGI應用程序。例如,你可以用Flask基於的Werkzeug來做到這一點(這讓我相信Flask可能會以某種方式支持它)。你提到的其他框架也可能支持它,但我從未試圖將它們與其他原始WSGI應用程序集成。 – icktoofay 2013-05-02 04:33:03

0

爲了簡單起見,我喜歡web.py。它可以做分塊傳輸編碼。

http://webpy.org/cookbook/streaming_large_files

但是......

這隻會餵養在多個部分響應工作。如果您想嘗試將您的數據「流」到客戶端的服務器上,則需要客戶端執行多個較小的POST。而且你不能通過單個響應來處理來自不同POST的多個響應......可能很明顯嗎?

這是一個難以解決的問題,看起來似乎最初,但我仍然建議使用web.py或類似的輕量級框架構建ReSTful接口。

+0

有趣的是,我很驚訝它不會接受分塊的POST數據。 我注意到,Django似乎允許你從傳入的上傳中提取數據(請參閱https://docs.djangoproject.com/en/dev/topics/http/file-uploads/),但我認爲這實際上是什麼在調用處理程序之前它會等待整個POST請求到達,並且「塊」循環只是爲了使本地I/O運行更平滑。 – user1478842 2013-04-29 00:50:46