Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用大文件做出响应_Python_Flask_Download - Fatal编程技术网

Python 用大文件做出响应

Python 用大文件做出响应,python,flask,download,Python,Flask,Download,因此,我对文件I/O和内存限制以及诸如此类的问题非常熟悉,我很难让我的web应用程序通过flask的make_response成功地将大文件下载到web浏览器。以下代码适用于较小的文件(请参阅上的文档)。基本上,您编写的函数可以生成数据块,并将该生成器传递给响应,而不是一次传递整个响应。Flask和您的web服务器完成其余工作 from flask import stream_with_context, Response @app.route('/stream_data') def strea

因此,我对文件I/O和内存限制以及诸如此类的问题非常熟悉,我很难让我的web应用程序通过flask的
make_response
成功地将大文件下载到web浏览器。以下代码适用于较小的文件(请参阅上的文档)。基本上,您编写的函数可以生成数据块,并将该生成器传递给响应,而不是一次传递整个响应。Flask和您的web服务器完成其余工作

from flask import stream_with_context, Response

@app.route('/stream_data')
def stream_data():
    def generate():
        # create and return your data in small parts here
        for i in xrange(10000):
            yield str(i)

    return Response(stream_with_context(generate()))

如果文件是静态的,您可以改为利用。文档建议您使用nginx或其他支持X-SendFile的服务器,以便读取和发送数据是高效的。

尝试中的问题是,您首先将完整内容读取为“原始字节”,因此,对于大文件,您很容易耗尽所有内存

有多个选项可以解决此问题:

流式传输内容 正如davidism answer所解释的,您可以使用生成器传递的int响应。这可以一块一块地为大文件服务,并且不需要太多内存

流媒体不仅可以从生成器进行,还可以从文件进行,如

在flask上提供静态文件 如果您的文件是静态文件,请搜索如何配置Flask以提供静态文件。这些文件应以流式方式自动提供

通过
apache
nginx
(或其他web服务器)提供静态文件服务
假设文件是静态的,则在生产过程中,您应该在Flask应用程序前通过反向代理提供该文件。这不仅可以减轻应用程序的负担,而且工作速度更快。

为什么要读取该文件?您可以使用该函数让Flask为您提供该文件。@MartijnPieters,因为我不知道存在这样一个函数:D I just修改了实现以使用它,现在我遇到了另一个问题;它似乎记住了打开的给定类型的第一个文件,并将其用于该类型的所有后续文件。即,如果我有一组png文件、一个pdf文件和一个txt文件,应用程序将成功下载第一个正确的png,然后为sa提供服务在服务器端,我已经验证了send_file函数是否获得了到png的正确路径,但它仍然会出现错误。然后,还有一些问题仍然存在;这不是
send_file()
本身能够产生的行为。
from flask import stream_with_context, Response

@app.route('/stream_data')
def stream_data():
    def generate():
        # create and return your data in small parts here
        for i in xrange(10000):
            yield str(i)

    return Response(stream_with_context(generate()))