Джанго вернуть большой файл - PullRequest
2 голосов
/ 20 декабря 2009

Я пытаюсь найти лучший (самый эффективный) способ вернуть большие файлы из Django обратно в http-клиент.

  • получить http получить запрос
  • чтение большого файла с диска
  • вернуть содержимое этого файла

Я не хочу читать файл, а затем публиковать ответ, используя HttpResponse, так как содержимое файла сначала сохраняется в ОЗУ, если я прав. Как я могу сделать это эффективно?

Laurent

Ответы [ 3 ]

3 голосов
/ 20 декабря 2009

Посмотрите mod_xsendfile на Apache (или его эквиваленты для nginx и т. Д.), Если вы хотите использовать Django для аутентификации. В противном случае вам не нужно нажимать на django, а просто на сервер прямо из Apache.

2 голосов
/ 20 декабря 2009

Здесь есть билет, который предназначен для решения этой проблемы: http://code.djangoproject.com/ticket/2131

Он добавляет класс HttpResponseSendFile, который использует sendfile () для отправки файла, который прозрачно отправляет файл по мере его чтения.

Однако стандартный HttpResponse реализован как итератор, поэтому, если вы передадите ему файлоподобный объект, он будет следовать своей итерационной семантике, поэтому, вероятно, вы могли бы создать файлово-подобный объектный обертку, которая будет разбивать файл на достаточно малые размеры. штук перед отправкой.

Я считаю, что семантика перебора стандартного файлового объекта в python заключается в том, что он читает построчно, что, скорее всего, не решит вашу проблему, если вы работаете с двоичными файлами.

Конечно, вы всегда можете поместить статические файлы в другое место и использовать их на обычном веб-сервере, если только вам не требуется сложный контроль (например, контроль доступа, требующий знания базы данных Django)

1 голос
/ 20 декабря 2009

Я предпочитаю синтезировать django с вашим http-сервером, чтобы, когда вы хотите обслуживать статические файлы, вы просто указывали им путь, который никогда не достигнет django. Стратегия будет выглядеть примерно так:

  1. Сконфигурируйте http-сервер так, чтобы некоторые запросы отправлялись в django, а другие - в корень статического документа
  2. ссылка на статические документы с любых веб-страниц, которые, очевидно, нуждаются в статических документах (например, CSS, JavaScript и т. Д.)
  3. для любого неочевидного возврата статического документа используйте HttpRedirect("/web-path/to/doc").
  4. Если вам нужно включить статический документ в динамический документ (возможно, просмотрщик страниц, оборачивающий большой текстовый или двоичный файл), то верните страницу-обертку, которая заполняет div с помощью вызова ajax к вашему статическому документу. *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...