javascript - Server side event (SSE) in Flask pushes constantly instead of on request -


i have python flask application supposed push server side event (sse) webpage when specific events triggered (e.g. via interval timer, when user pushes specific button on page etc.).

however, not flask push message when request app so. instead, after starting app, keeps pushing message server every few seconds not want.

my minimal example behaviour looks this:

from flask import flask flask import render_template, response  random import randint  app = flask(__name__)  # function push data server def pushdata():      # randint make every message not same     number = randint(0,9)      print('i push data server: {0}'.format(number))     yield 'data: %s\n\n' % 'i data has been pushed server: {0}'.format(number)  # provide sse stream web browser @app.route('/listenforpushes') def stream():      return response(pushdata(), mimetype="text/event-stream")  # render simple html page browser @app.route('/html') def html():     return render_template('webpage.html')  # run when app starts. should execute 1 push @ app start. @app.before_first_request def _run_on_start():     pushdata()  if __name__ == "__main__":      app.run(host='0.0.0.0', debug=true, threaded=true, use_reloader=false, port=3000) 

the html page event listener sse called webpage.html (put in folder templates flask can find without further configuration) looks this:

<html> <head></head>     <body>this test page, please check console output.      <script type="text/javascript">          var source = new eventsource('/listenforpushes');         source.onmessage = function(event) {             console.log(event.data);         }      </script>      </body> </html> 

when start application, messages pushed page every 2-3 seconds output in python console , browser's console (right click image , click 'view image' enlarged):

console output

instead, expect push once when app started , no more. how desired behaviour achieved, or rather how can trigger push manually (e.g. via scheduler, click on page etc.)?

first off, cannot trigger request browser side using sse. after "server sent" events. browser establishes connection , waits events arrive if , when server decides send them. if need able trigger events browser, need websockets.

with out of way, here think happening code. pushdata() sends 1 response when called. after that, exits , server closes connection browser. per sse protocol, browser reestablishes connection after 3 secs , function runs again, exits , server closes connection again. , cycle continues forever.

to achieve want (and benefit using sse in general), pushdata() shouldn't exit. should generator function , determine when/if needs send browser. way connection browser remain open.

btw, don't need _run_on_start()


Comments