2016-09-01 12 views
1

Flaskサーバー(サーバー#01と呼ぶ)を別のサーバー(サーバー#02)で「プロキシ」しようとしています。一つのことを除いてうまくいく:Server#01がsend_from_directory()を使うとき、私はこのファイルを再送する方法を知らない。Flaskが応答としてストリームを送信しました

私の古典「プロキシ」ファイルで

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

それは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) 

あなたはiter_content()によって返された発電機内部要求コンテキストにアクセスする必要はありませんので、あなたも、ここstream_with_context()を使用する必要はありません。

+0

私は "chunk_size = 10 * 1024"を探していました。それで、私のクライアントは1MB以下の画像をロードするのに108秒かかりました。今は121msです。ストリームは必要ありません、私はそれを間違って使用しました。あなたの助けのためのThx –

+0

@BenjaminK:大きなファイルがある場合、ストリーミングはあなたを助けます。私は1GBを超えるファイルでテストしていました。この影響は1MBファイルには気付かれません。 – mhawke

関連する問題