2017-03-15 3 views
0

フラスコAPI(バックエンド)とフロントエンドアプリケーションの2つのアプリケーションがあります。最近、私は、フロントエンドがいくつかのデータ(ページ番号)を取得し、その内容を戻すためにAPIを呼び出すことができるように、ストリーミングメカニズムを実装しなければなりませんでした。APIコールに依存するフラスコ応答のストリーミング

ここでは、Flaskで応答をストリーミングする方法について説明したガイドに従っています。

フロントエンドでの私の擬似コードは、基本的に次のようになります。私は、次の手順を実行し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も透過的にプロキシされています。

あなたの質問に答えるには、ジェネレータでブロッキングコールを使用するかどうかは関係ありませんが、あなたの例を考えれば、なぜそうしたいのかわかりません。

関連する問題