2016-01-24 2 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 является достаточно, чтобы построить данные. Таким образом, в представлении выше я извлекаю сегменты с серверов хранения и объединяя их.

Мой вопрос: Как я могу напрямую обслуживать файл doc без его сохранения. Там в любом случае?

+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

Смежные вопросы