Lihat Acara yang Dikirim oleh Server. Server-Sent Events adalah API browser yang memungkinkan Anda tetap membuka soket ke server Anda, berlangganan aliran pembaruan. Untuk Informasi lebih lanjut, baca posting Alex MacCaw (Penulis Juggernaut) tentang mengapa dia membunuh raksasa dan mengapa Peristiwa yang Dikirim oleh Server yang lebih sederhana dalam banyak kasus merupakan alat yang lebih baik untuk pekerjaan itu daripada Soket Web.
Protokolnya sangat mudah. Cukup tambahkan mimetype text/event-stream
untuk tanggapan Anda. Browser akan menjaga koneksi tetap terbuka dan mendengarkan pembaruan. Acara yang dikirim dari server adalah baris teks yang dimulai dengan data:
dan baris baru berikut.
data: this is a simple message
<blank line>
Jika Anda ingin bertukar data terstruktur, cukup buang data Anda sebagai json dan kirim json melalui kabel.
Keuntungannya adalah Anda dapat menggunakan SSE di Flask tanpa memerlukan server tambahan. Ada contoh aplikasi chat sederhana di github yang menggunakan redis sebagai 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")
Anda tidak perlu menggunakan gunicron untuk menjalankan aplikasi contoh. Pastikan untuk menggunakan threading saat menjalankan aplikasi, karena jika tidak, koneksi SSE akan memblokir server pengembangan Anda:
if __name__ == '__main__':
app.debug = True
app.run(threaded=True)
Di sisi klien, Anda hanya memerlukan fungsi pengendali Javascript yang akan dipanggil saat pesan baru didorong dari server.
var source = new EventSource('/stream');
source.onmessage = function (event) {
alert(event.data);
};
Server-Sent Events didukung oleh browser Firefox, Chrome, dan Safari terbaru.Internet Explorer belum mendukung Server-Sent Events, tetapi diharapkan mendukungnya di Versi 10. Ada dua Polyfill yang direkomendasikan untuk mendukung browser lama
- EventSource.js
- jquery.eventsource