【问题标题】:Flask send stream as responseFlask 发送流作为响应
【发布时间】:2023-03-15 00:13:01
【问题描述】:

我正在尝试将我的 Flask 服务器(我将其称为 Server#01)与另一台服务器(Server#02)“代理”。它运行良好,除了一件事:当 Server#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')

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

【问题讨论】:

    标签: python redirect flask proxy


    【解决方案1】:

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

    默认情况下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() 返回的生成器中的请求上下文。

    【讨论】:

    • 我在寻找“chunk_size=10*1024”。没有它,我的客户花了 108 秒来加载
    • @BenjaminK:如果您有大文件,流式传输会帮助您。我正在使用 > 1GB 的文件进行测试。 1MB 文件不会受到影响。
    • 非常感谢!这解决了我的流媒体播放速度如此缓慢的原因。
    猜你喜欢
    • 1970-01-01
    • 2020-06-20
    • 2019-07-12
    • 2012-04-20
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2016-04-25
    • 2020-07-30
    相关资源
    最近更新 更多