问题:
http服务之间传递结果流
一个由flask封装起来的算法,一个由django封装的后台,我希望在django里通过requests调用flask的算法接口,flask可以分析一帧返回一帧结果,追求分析结果的实时返回,而不是完全分析完再完整返回结果
为了能完整返回结果,暂时想到的模式有以下三种:
一问一答:等待完整的分析结果,然后返回,最不济就用这种
我要你给(长链接):flask返回一个generator,django取next就得到下一个的结果
你有你给(理想,长链接):建立长链接,flask每分析出一帧结果,就返回
一次结果,直到分析结束,关闭连接
看到flask中有个flask_socketio建立socket连接,还没有实验
暂时用StreamingHttpResponse,generater能实现实时分析的感觉,属于第三种模式(你有你给)
django的StreamingHttpResponse可以返回generater,request调用返回generate的接口的时候,通过contextlib 的closing对流进行处理:
#django 算法端,输出流
from django.http import StreamingHttpResponse
def stream_response(request):
def generate():
for i in range(10):
print(i)
yield 'hi ' + str(i)
print('sleep 3')
time.sleep(1)
return StreamingHttpResponse(generate(), )
#flask 算法端,输出流
@app.route('/re', methods=('POST', ))
def re():
@flask.stream_with_context
def generate():
for i in range(10):
print(i)
yield 'hi ' + str(i)
print('sleep 3')
time.sleep(1)
return flask.Response(generate())
#flask 算法端
@app.route('/test', methods=['POST', 'GET'])
def test():
url = 'http://172.16.68.151:8000/test2'
from contextlib import closing
with closing(requests.get(url, stream=True)) as r1:
for i in r1.iter_content():
print(i)