2016-01-24 141 views
1

因此,我有用戶從一個django服務器請求他們的文件,其中一些進程發生在請求的文件上。目前我正在將文件寫入磁盤並從那裏提供。django:有沒有辦法直接從內存中提供文件

有沒有辦法直接從內存向用戶提供文件以獲得更好的效率和性能(使用x-sendfile)?

這是我的當前視圖:

def ServeSegment(request, segmentID): 
    segments =[] 
    obj = MainFile.objects.filter(owner=request.user) 
    file_name = MainFile.objects.get(file_id=segmentID).file_name 
    file_suffix = file_name = MainFile.objects.get(file_id=segmentID).file_suffix 
    if request.method == 'GET': 
     hosts = settings.HOSTS 
     for i in hosts: 
      try: 
       url = 'http://' + i + ':8000/foo/'+str(segmentID) 
       r = requests.get(url, timeout=1, stream=True) 
       if r.status_code == 200: 
        segments.append(r.content) 
      except: 
       continue 
     instance = SeIDA(filename='test', x=settings.M, y=settings.N) 
     docfile = instance.decoder(segments) 
     with open('/tmp/Files/'+file_name, 'wb') as f: 
      f.write(docfile) 
      response = HttpResponse() 
      response['Content-Disposition'] = 'attachment; filename={0}'.format(file_name) 
      response['X-Sendfile'] = "/tmp/Files/{0}".format(file_name) 
      return response 

:正在使用SeIDA模塊,將數據編碼爲N個段,使得M個段是足以構建數據。所以在上面的視圖中,我正在從存儲服務器中檢索片段並將它們組合在一起。

我的問題是:如何直接提供docfile而不保存它。無論如何?

+0

我想答案可以在這裏找到:http://stackoverflow.com/a/909088/2372812 –

回答

0

使用X-Sendfile無法從內存中爲它提供服務,因爲即使是在完全獨立的計算機上,Apache運行在不同的進程中。

但是在這種情況下,使用sendfile並不是真的讓事情變得更有效率。既然你說這個文件已經在內存中,那麼你應該直接從那裏直接服務它,而不用通過Apache:只需在響應中返回即可。

docfile = instance.decoder(segments) 
response = HttpResponse() 
response.write(docfile) 
response['Content-Disposition'] = 'attachment; filename={0}'.format(file_name) 
return response 
+0

不知道我可以直接寫信給響應,感謝教我的。這種方法適合處理多個請求文件的併發連接嗎? – Miind

相關問題