Dê uma olhada em Eventos enviados pelo servidor. Server-Sent Events é uma API de navegador que permite que você mantenha aberto um soquete para seu servidor, assinando um fluxo de atualizações. Para obter mais informações, leia o post de Alex MacCaw (Autor de Juggernaut) sobre por que ele mata juggernaut e por que os eventos enviados pelo servidor mais simples são, em muitos casos, a melhor ferramenta para o trabalho do que Websockets.
O protocolo é muito fácil. Basta adicionar o mimetype
text/event-stream
à sua resposta. O navegador manterá a conexão aberta e ouvirá as atualizações. Um Eventsent do servidor é uma linha de texto que começa com data:
e uma nova linha a seguir. data: this is a simple message
<blank line>
Se você quiser trocar dados estruturados, basta despejar seus dados como json e enviar o json pela rede.
Uma vantagem é que você pode usar SSE no Flask sem a necessidade de um extraServer. Existe um exemplo simples de aplicativo de bate-papo no github que usa o redis como um back-end 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")
Você não precisa usar gunicron para executar o aplicativo de exemplo. Apenas certifique-se de usar o encadeamento ao executar o aplicativo, pois caso contrário a conexão SSE bloqueará seu servidor de desenvolvimento:
if __name__ == '__main__':
app.debug = True
app.run(threaded=True)
No lado do cliente, você só precisa de uma função de manipulador Javascript que será chamada quando uma nova mensagem for enviada por push do servidor.
var source = new EventSource('/stream');
source.onmessage = function (event) {
alert(event.data);
};
Eventos enviados pelo servidor são suportados pelos navegadores Firefox, Chrome e Safari recentes. O Internet Explorer ainda não suporta eventos enviados pelo servidor, mas espera-se que os suporte na versão 10. Há dois Polyfills recomendados para suportar navegadores mais antigos
- EventSource.js
- jquery.eventsource