2016-09-01 3 views
1

Я пытаюсь «проксировать» мой сервер Flask (я буду называть его сервером # 01) с другим сервером (Server # 02). Он работает хорошо, за исключением одного: когда сервер # 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 и указать 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().

+0

Я искал «chunk_size = 10 * 1024». без него мой клиент взял 108сек для загрузки изображения <1 мб. Теперь это 121 мс. Поток не нужен, я использовал его неправильно. Thx для вашей помощи –

+0

@BenjaminK: потоковая передача поможет вам, если у вас большие файлы. Я тестировал файл размером> 1 ГБ. Аффект не будет замечен в файлах 1 МБ. – mhawke

Смежные вопросы