Spójrz na zdarzenia wysyłane przez serwer. Zdarzenia wysyłane przez serwer to interfejs API przeglądarki, który pozwala zachować otwarte gniazdo na serwerze, subskrybując strumień aktualizacji. Aby uzyskać więcej informacji, przeczytaj post Alexa MacCawa (autora Juggernaut) o tym, dlaczego zabija molocha i dlaczego prostsze zdarzenia wysyłane przez serwer są w wielu przypadkach lepszym narzędziem do pracy niż gniazda sieciowe.
Protokół jest naprawdę prosty. Po prostu dodaj typ MIME text/event-stream
do twojej odpowiedzi. Przeglądarka będzie utrzymywać połączenie otwarte i nasłuchiwać aktualizacji. Zdarzenie z serwera to wiersz tekstu zaczynający się od data:
i następujący znak nowej linii.
data: this is a simple message
<blank line>
Jeśli chcesz wymieniać dane strukturalne, po prostu zrzuć swoje dane jako json i wyślij json przez sieć.
Zaletą jest to, że możesz używać SSE w Flask bez konieczności posiadania dodatkowego serwera. Na githubie znajduje się prosty przykład aplikacji do czatu, która wykorzystuje redis jako backend pub/sub.
def event_stream():
pubsub = red.pubsub()
pubsub.subscribe('chat')
for message in pubsub.listen():
print message
yield 'data: %s\n\n' % message['data']
@app.route('/post', methods=['POST'])
def post():
message = flask.request.form['message']
user = flask.session.get('user', 'anonymous')
now = datetime.datetime.now().replace(microsecond=0).time()
red.publish('chat', u'[%s] %s: %s' % (now.isoformat(), user, message))
@app.route('/stream')
def stream():
return flask.Response(event_stream(),
mimetype="text/event-stream")
Nie musisz używać gunicron do uruchomienia przykładowej aplikacji. Upewnij się tylko, że używasz wątków podczas uruchamiania aplikacji, ponieważ w przeciwnym razie połączenie SSE zablokuje Twój serwer deweloperski:
if __name__ == '__main__':
app.debug = True
app.run(threaded=True)
Po stronie klienta potrzebujesz tylko funkcji obsługi JavaScript, która zostanie wywołana, gdy nowa wiadomość zostanie wypchnięta z serwera.
var source = new EventSource('/stream');
source.onmessage = function (event) {
alert(event.data);
};
Zdarzenia wysyłane przez serwer są obsługiwane przez najnowsze przeglądarki Firefox, Chrome i Safari. Internet Explorer nie obsługuje jeszcze zdarzeń wysyłanych przez serwer, ale oczekuje się, że będzie obsługiwał je w wersji 10. Istnieją dwa zalecane wypełnienia do obsługi starszych przeglądarek
- Źródło zdarzenia.js
- jquery.eventsource