Python 用大文件做出响应
因此,我对文件I/O和内存限制以及诸如此类的问题非常熟悉,我很难让我的web应用程序通过flask的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
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()))