Ответ 1
Посмотрите События, отправленные сервером. События, отправленные сервером, являются API браузера, который позволяет вам открывать сокет на ваш сервер, подписываясь на поток обновлений. Для получения дополнительной информации читайте Alex MacCaw (Автор Juggernaut) на почему он убивает juggernaut и почему более простой События, отправленные сервером, в тяжелых случаях - лучший инструмент для работы, чем WebSockets.
Протокол очень прост. Просто добавьте mimetype text/event-stream
к вашему
ответ. Браузер будет поддерживать соединение открытым и слушать обновления. Мероприятие
отправленный с сервера, представляет собой строку текста, начинающуюся с data:
и следующей строки новой строки.
data: this is a simple message
<blank line>
Если вы хотите обмениваться структурированными данными, просто сбрасывайте свои данные как json и отправляйте json через провод.
Преимущество состоит в том, что вы можете использовать SSE в Flask без необходимости в дополнительном Сервер. В github есть простой пример чат-приложения, который использует redis как паб/вспомогательный сервер.
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 пока не поддерживает события Server-Sent, но ожидается, что они будут поддерживать их в Версия 10. Для поддержки старых браузеров существуют два рекомендованных полифайла.