python httpストリーミングHttpResponseによる連続データ転送長リンクの完了

7029 ワード

質問:httpサービス間で結果ストリームを渡すflaskでカプセル化されたアルゴリズム、djangoでカプセル化されたバックグラウンド、私はdjangoの中でrequestsを通じてflaskのアルゴリズムインタフェースを呼び出すことを望んで、flaskは1フレームを分析して1フレームの結果を返すことができて、分析結果のリアルタイムの戻りを追求して、完全に分析してから完全に結果を返すのではありません
結果を完全に返すために、一時的に思いついたパターンは以下の3つあります.1つの質問に答えます.完全な分析結果を待って、それから戻って、最も役に立たないのはこれです.flaskはgeneratorを返して、djangoはnextを取って次の結果を得ます.あなたはあなたにあげます(理想、長いリンク):長いリンクを確立して、flaskは1フレームの結果を分析します.解析が終了するまで結果を返し、接続を閉じます.
flaskにflaskがありますsocketioはsocket接続を確立し、まだ実験していない.
一時的にStreamingHttpResponse、generaterでリアルタイム分析の感覚を実現でき、3番目のモード(あなたが与える)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,djangoを区別せずにrequest,contextlibで
  • を実現
    #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)