Разгледайте изпратените от сървъра събития. Server-Sent Events е API за браузър, който ви позволява да поддържате отворен сокет към вашия сървър, като се абонирате за поток от актуализации. За повече информация прочетете публикацията на Alex MacCaw (автор на Juggernaut) за това защо той убива juggernaut и защо по-простите събития, изпратени от сървъра, в много случаи са по-добрият инструмент за работа от Websockets.
Протоколът е наистина лесен. Просто добавете mimetype text/event-stream
на вашия отговор. Браузърът ще поддържа връзката отворена и ще слуша за актуализации. Eventsent от сървъра е ред от текст, започващ с data:
и следващ нов ред.
data: this is a simple message
<blank line>
Ако искате да обменяте структурирани данни, просто изхвърлете данните си като json и изпратете json по кабел.
Предимство е, че можете да използвате SSE във Flask без нужда от допълнителен сървър. Има прост пример за приложение за чат на github, който използва Redis като бекенд на 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")
Не е необходимо да използвате gunicron, за да стартирате примерното приложение. Просто се уверете, че използвате нишки, когато стартирате приложението, защото в противен случай връзката SSE ще блокира вашия сървър за разработка:
if __name__ == '__main__':
app.debug = True
app.run(threaded=True)
От страна на клиента ви трябва просто функция за обработка на Javascript, която ще бъде извикана, когато ново съобщение бъде избутано от сървъра.
var source = new EventSource('/stream');
source.onmessage = function (event) {
alert(event.data);
};
Събитията, изпратени от сървъра, се поддържат от последните браузъри Firefox, Chrome и Safari. Internet Explorer все още не поддържа събития, изпратени от сървъра, но се очаква да ги поддържа във Версия 10. Има два препоръчани Polyfill за поддръжка на по-стари браузъри
- EventSource.js
- jquery.eventsource