Hãy xem Sự kiện do máy chủ gửi. Sự kiện do máy chủ gửi là API trình duyệt cho phép bạn tiếp tục mở một ổ cắm cho máy chủ của mình, đăng ký vào dòng cập nhật. Để biết thêm thông tin, hãy đọc Alex MacCaw (Tác giả củaJuggernaut) đăng bài về lý do tại sao anh ta giết juggernaut và tại sao Sự kiện do máy chủ gửi đơn giản hơn trong các trường hợp man rợ là công cụ tốt hơn cho công việc so với Websockets.
Giao thức thực sự dễ dàng. Chỉ cần thêm mimetype text/event-stream
cho phản hồi của bạn. Trình duyệt sẽ giữ kết nối mở và lắng nghe các bản cập nhật. Sự kiện từ máy chủ là một dòng văn bản bắt đầu bằng data:
và một dòng mới sau đây.
data: this is a simple message
<blank line>
Nếu bạn muốn trao đổi dữ liệu có cấu trúc, chỉ cần kết xuất dữ liệu của bạn dưới dạng json và gửi json qua dây.
Một lợi thế là bạn có thể sử dụng SSE trong Flask mà không cần thêm một Máy chủ phụ. Có một ví dụ ứng dụng trò chuyện đơn giản trên github sử dụng redis như một pub / sub backend.
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")
Bạn không cần sử dụng gunicron để chạy ứng dụng ví dụ. Chỉ cần đảm bảo sử dụng phân luồng khi chạy ứng dụng, vì nếu không, kết nối SSE sẽ chặn máy chủ phát triển của bạn:
if __name__ == '__main__':
app.debug = True
app.run(threaded=True)
Ở phía máy khách, bạn chỉ cần một hàm xử lý Javascript sẽ được gọi khi một tin nhắn mới được đẩy từ máy chủ.
var source = new EventSource('/stream');
source.onmessage = function (event) {
alert(event.data);
};
Sự kiện do máy chủ gửi được hỗ trợ bởi các trình duyệt Firefox, Chrome và Safari gần đây. Internet Explorer chưa hỗ trợ Sự kiện do máy chủ gửi, nhưng dự kiến sẽ hỗ trợ chúng trong Phiên bản 10. Có hai Polyfills được khuyến nghị để hỗ trợ các trình duyệt cũ hơn
- EventSource.js
- jquery.eventsource