Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Como implementar o push do servidor no framework Flask?


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