Flask发送流作为响应

时间:2016-09-01 12:51:44

标签: python redirect flask proxy

我试图"代理"我的Flask服务器(我将其称为Server#01)与另一台服务器(Server#02)。除了一件事情之外它运作良好:当服务器#01使用send_from_directory()时,我不知道如何重新发送此文件。

我的经典"代理"

result = requests.get(my_path_to_server01)
return Response(stream_with_context(result.iter_content()), 
                content_type = result.headers['Content-Type'])

如果文件有回复,则需要花费数小时......所以我尝试了很多东西。工作的人是:

result = requests.get(my_path_to_server01, stream=True)

with open('img.png', 'wb') as out_file:
    shutil.copyfileobj(result.raw, out_file)

return send_from_directory('./', 'img.png')

我想"重定向"我的回复("结果"变量),或发送/复制我的文件流。无论如何我不想使用物理文件,因为它似乎不是我认为正确的方式,我可以想象所有可能因此发生的问题。

1 个答案:

答案 0 :(得分:6)

除了应使用stream=True之外,您的“经典”代理应该没有任何问题,并为chunk_size指定response.iter_content()

默认情况下chunk_size是1个字节,因此流式传输效率非常低,因此非常慢。尝试更大的块大小,例如10K应该会产生更快的转移。这是代理的一些代码。

import requests
from flask import Flask, Response, stream_with_context

app = Flask(__name__)

my_path_to_server01 = 'http://localhost:5000/'

@app.route("/")
def streamed_proxy():
    r = requests.get(my_path_to_server01, stream=True)
    return Response(r.iter_content(chunk_size=10*1024),
                    content_type=r.headers['Content-Type'])

if __name__ == "__main__":
    app.run(port=1234)

您甚至不需要在此使用stream_with_context(),因为您不需要访问iter_content()返回的生成器中的请求上下文。