【发布时间】:2009-12-20 01:21:30
【问题描述】:
我正在尝试找到将大文件从 Django 返回到 http 客户端的最佳方式(最有效的方式)。
- 接收http get请求
- 从磁盘读取大文件
- 返回该文件的内容
我不想读取文件然后使用 HttpResponse 发布响应,因为如果我是正确的,文件内容首先存储在 RAM 中。我怎样才能有效地做到这一点?
劳伦特
【问题讨论】:
我正在尝试找到将大文件从 Django 返回到 http 客户端的最佳方式(最有效的方式)。
我不想读取文件然后使用 HttpResponse 发布响应,因为如果我是正确的,文件内容首先存储在 RAM 中。我怎样才能有效地做到这一点?
劳伦特
【问题讨论】:
如果您喜欢使用 Django 进行身份验证,请查看 Apache(或 nginx 等)上的 mod_xsendfile。否则,无需使用 django,直接从 Apache 提供服务器即可。
【讨论】:
这里有一张票旨在解决这个问题:http://code.djangoproject.com/ticket/2131
它添加了一个 HttpResponseSendFile 类,该类使用 sendfile() 发送文件,它在读取文件时透明地发送文件。
但是,标准的 HttpResponse 是作为迭代器实现的,所以如果你向它传递一个类似文件的对象,它将遵循它的迭代语义,所以大概你可以创建一个类似文件的对象包装器,将文件分块足够小寄出之前的碎片。
我相信在 python 中迭代标准文件对象的语义是它逐行读取,如果您正在处理二进制文件,这很可能无法解决您的问题。
当然,您总是可以将静态文件放在另一个位置并使用普通的 Web 服务器来提供,除非您需要复杂的控制(例如需要了解 Django 数据库知识的访问控制)
【讨论】:
我对这一切的偏好是将 django 与你的 http 服务器合成,这样当你想要提供静态文件时,你只需将它们引用到一个永远不会到达 django 的路径。该策略将如下所示:
HttpRedirect("/web-path/to/doc")。【讨论】: