【问题标题】:Django return large fileDjango返回大文件
【发布时间】:2009-12-20 01:21:30
【问题描述】:

我正在尝试找到将大文件从 Django 返回到 http 客户端的最佳方式(最有效的方式)。

  • 接收http get请求
  • 从磁盘读取大文件
  • 返回该文件的内容

我不想读取文件然后使用 HttpResponse 发布响应,因为如果我是正确的,文件内容首先存储在 RAM 中。我怎样才能有效地做到这一点?

劳伦特

【问题讨论】:

    标签: django http file response


    【解决方案1】:

    如果您喜欢使用 Django 进行身份验证,请查看 Apache(或 nginx 等)上的 mod_xsendfile。否则,无需使用 django,直接从 Apache 提供服务器即可。

    【讨论】:

      【解决方案2】:

      这里有一张票旨在解决这个问题:http://code.djangoproject.com/ticket/2131

      它添加了一个 HttpResponseSendFile 类,该类使用 sendfile() 发送文件,它在读取文件时透明地发送文件。

      但是,标准的 HttpResponse 是作为迭代器实现的,所以如果你向它传递一个类似文件的对象,它将遵循它的迭代语义,所以大概你可以创建一个类似文件的对象包装器,将文件分块足够小寄出之前的碎片。

      我相信在 python 中迭代标准文件对象的语义是它逐行读取,如果您正在处理二进制文件,这很可能无法解决您的问题。

      当然,您总是可以将静态文件放在另一个位置并使用普通的 Web 服务器来提供,除非您需要复杂的控制(例如需要了解 Django 数据库知识的访问控制)

      【讨论】:

        【解决方案3】:

        我对这一切的偏好是将 django 与你的 http 服务器合成,这样当你想要提供静态文件时,你只需将它们引用到一个永远不会到达 django 的路径。该策略将如下所示:

        1. 配置 http 服务器,使一些请求转到 django,一些转到静态文档根目录
        2. 从显然需要静态文档(例如 css、javascript 等)的任何网页链接到静态文档
        3. 对于静态文档的任何非明显返回,请使用HttpRedirect("/web-path/to/doc")
        4. 如果您需要将静态文档包含在动态文档中(可能是包装大文本或二进制文件的页面查看器),则返回一个包装页面,该页面使用对您的静态文档的 ajax 调用填充 div。李>

        【讨论】:

        • 我需要控制谁可以访问基于 db 的文件,因此它必须以某种方式链接到 Django。
        猜你喜欢
        • 1970-01-01
        • 2020-03-03
        • 2014-10-16
        • 2021-08-14
        • 1970-01-01
        • 2021-09-11
        • 1970-01-01
        • 2019-08-02
        • 2017-10-18
        相关资源
        最近更新 更多