복붙노트

[PYTHON] Python 및 Flask로 데이터 스트리밍

PYTHON

Python 및 Flask로 데이터 스트리밍

나는 플라스크의 스트리밍을 사용하는 방법을 알아낼 수 없습니다. 내 코드는 다음과 같습니다.

@app.route('/scans/')
def scans_query():
    url_for('static', filename='.*')
    def generate():
        yield render_template('scans.html')
        for i in xrange(50):
            sleep(.5)
            yield render_template('scans.html', **locals())
    return Response(stream_with_context(generate()))

및 내 템플릿 :

<p>{% i %}</p>

나는 페이지에서 반 초마다 바뀌는 카운터를보고 싶다. 대신, 내가 얻은 가장 가까운 것은 다음 줄에 각 번호를 인쇄하는 페이지입니다.

해결법

  1. ==============================

    1.페이지의 기존 콘텐츠를 바꾸려면 javascript가 필요합니다. 즉, 보내거나 긴 폴링, 웹 소켓 등을 사용하여 요청을 보내거나 만들 수 있습니다. 서버 보내기 이벤트를 사용하는 방법은 여러 가지가 있습니다.

    페이지의 기존 콘텐츠를 바꾸려면 javascript가 필요합니다. 즉, 보내거나 긴 폴링, 웹 소켓 등을 사용하여 요청을 보내거나 만들 수 있습니다. 서버 보내기 이벤트를 사용하는 방법은 여러 가지가 있습니다.

    #!/usr/bin/env python
    import itertools
    import time
    from flask import Flask, Response, redirect, request, url_for
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        if request.headers.get('accept') == 'text/event-stream':
            def events():
                for i, c in enumerate(itertools.cycle('\|/-')):
                    yield "data: %s %d\n\n" % (c, i)
                    time.sleep(.1)  # an artificial delay
            return Response(events(), content_type='text/event-stream')
        return redirect(url_for('static', filename='index.html'))
    
    if __name__ == "__main__":
        app.run(host='localhost', port=23423)
    

    static / index.html의 위치 :

    <!doctype html>
    <title>Server Send Events Demo</title>
    <style>
      #data {
        text-align: center;
      }
    </style>
    <script src="http://code.jquery.com/jquery-latest.js"></script>
    <script>
    if (!!window.EventSource) {
      var source = new EventSource('/');
      source.onmessage = function(e) {
        $("#data").text(e.data);
      }
    }
    </script>
    <div id="data">nothing received yet</div>
    

    연결이 끊어지면 브라우저는 기본적으로 3 초 안에 다시 연결됩니다. 아무것도 보낼 서버가 없으면 서버는 404를 반환하거나 다음 요청에 대한 응답으로 'text / event-stream'콘텐츠 유형 이외의 것을 보낼 수 있습니다. 서버에 더 많은 데이터가 있더라도 클라이언트 측에서 중지하려면 source.close ()를 호출 할 수 있습니다.

    참고 : 스트림이 무한대가 아닌 경우 다른 기술 (SSE 아님)을 사용하여 자바 스크립트 스 니펫을 전송하여 텍스트를 대체하십시오 (무한