2017-03-15 9 views
0

플라스크 API (백엔드)와 프론트 엔드 애플리케이션이라는 두 가지 응용 프로그램이 있습니다. 최근에는 프런트 엔드가 일부 데이터 (페이지가 매겨진)를 검색하고 내용을 다시 스트림하기 위해 API를 호출 할 수 있도록 스트리밍 메커니즘을 구현해야했습니다.API 호출에 의존하는 플라스크 응답 스트리밍

응답을에 스트리밍하는 방법은 여기에 설명 된 가이드를 따랐습니다. 프론트 엔드에서

내 의사 코드는 기본적으로 다음과 같습니다 generate()

return Response(stream_with_context(generate())) 

나는 다음을 수행 : 내가 생산 결과가 일치하지 않는 것을 발견하고

def generate(): 
    # make blocking api call 
    data = requests.get(url) 
    for x in data: 
     yield x 

. 내 직감은 블로킹 API 호출과 관련이 있다는 것입니다. 사용자에게 스트리밍되는 생성기 내에서 차단 API 호출을하는 것이 괜찮습니까?

답변

0

라이브러리 requests을 처리 중이므로 stream=True을 전달하고 응답에서 해당 생성기를 사용해야합니다. flask.Response은 문자열 또는을 반복 할 수 있습니다.

@app.route("/foo") 
def foo(): 
    _resp = requests.get(url, stream=True) 
    _resp.raise_for_status() 

    resp = Response(
     response=stream_with_context(_resp.iter_content(chunk_size=1024*10)), 
     status=200, 
     content_type=_resp.headers["Content-Type"], 
     direct_passthrough=False) 
    return resp 

Content-Type도 투명하게 프록시됩니다.

귀하의 질문에 대한 답변을 얻으려면 발전기에서 차단 호출을 사용해도 상관 없습니다. 그러나 귀하의 사례를 고려해 볼 때 왜 그렇게하고 싶지는 않습니다.