如何使用Pylons提供大文件?

4 投票
3 回答
628 浏览
提问于 2025-04-16 08:57

我正在写一个基于Pylons的下载网关。这个网关的客户端会通过文件的ID来访问文件:

/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 个回答

0

最合理的做法是让控制器把用户引导到亚马逊的S3服务去下载文件,并且把文件存储在亚马逊的S3上。

1

我建议可以考虑使用nginx和http://wiki.nginx.org/XSendfile或者类似的东西。

2

有一点你需要注意的是,尽量避免在把第一个字节返回给客户端之前,把整个文件都加载到内存中。在wsgi中,你可以返回一个迭代器来处理响应的主体。webob的文档中有一个示例,你可以把它应用到你的控制器中。毕竟,pylons是使用webob的。

这样做的好处是,客户端可以立即收到反馈,知道文件正在下载,尽管返回第一个数据块可能需要一些时间。

你还可以看看GridFS在MongoDB中的实现,这是一种很不错的方式,可以建立一个分布式文件系统,特别适合那种“写一次,读很多次”的文件操作。

如果你需要自己动手做,这两者结合起来会是一个很好的起点。

撰写回答