Как мне обслуживать большие файлы с помощью Pylons? - PullRequest
4 голосов
/ 23 декабря 2010

Я пишу шлюз загрузки на основе Pylons.Клиент шлюза будет обращаться к файлам по идентификатору:

/file_gw/download/1

Внутренне доступ к самому файлу осуществляется через HTTP с внутреннего файлового сервера:

http://internal-srv/path/to/file_1.content

Файлы могут быть довольно большими, поэтомуЯ хочу транслировать контент.Я храню метаданные о файле в объекте модели StoredFile:

class StoredFile(Base):
    id = Column(Integer, primary_key=True)
    name = Column(String)
    size = Column(Integer)
    content_type = Column(String)
    url = Column(String)

Учитывая это, каков наилучший (то есть: наиболее архитектурно-обоснованный, производительный и т. Д.) Способ написания моего контроллера file_gw?

Ответы [ 3 ]

2 голосов
/ 24 декабря 2010

Единственное, чего вам следует избегать, это загрузить весь файл в память перед возвратом первого байта клиенту.В wsgi вы можете вернуть итератор для тела ответа.В документации по webob есть пример этого, что вы должны иметь возможность работать с вашим контроллером.В конце концов, pylons использует webob.

Общий эффект для этого заключается в том, что клиент сразу же получает отзыв о том, что файл загружается, сколько времени требуется для возврата первого фрагмента.Если взглянуть на реализацию GridFS для MongoDB, то это довольно хороший способ запустить распределенную файловую систему, оптимизированную для записи, когда выполняется чтение многих операций с файлами типов.

Сочетание этих двух вещей было бы хорошим началом, если бы вы сделали это сами.

1 голос
/ 23 декабря 2010

Я бы посоветовал использовать nginx и http://wiki.nginx.org/XSendfile или эквивалент.

0 голосов
/ 23 декабря 2010

Наиболее архитектурно обоснованным способом было бы перенаправление контроллера на Amazon S3 для загрузки файла и хранения файлов на Amazon S3.

...