2013-08-22 68 views
9

Có thể đây là vấn đề trong Flask, không có cách nào để xử lý sự kiện ngắt kết nối ở phía máy chủ.Flask Python, cách phát hiện khách hàng SSE ngắt kết nối từ giao diện người dùng Javascript

Trong lớp phản hồi, có một phương thức có tên là "call_on_close", nơi chúng tôi có thể thêm hàm không có đối số, ví dụ: on_close(), nó sẽ được kích hoạt khi phương thức close của đối tượng phản hồi được gọi, nhưng điều này không xảy ra khi tôi gọi EventSource.close() từ phía máy khách trong Javascript.

mã trên phía máy chủ:

from flask import Response 
r = Response(stream(), ...) 
r.call_on_close(on_close) 
return r 

def on_close(): 
    print "response is closed!" 

def stream(): 
    ... # subscribe to redis 
    for message in pubsub.listen(): 
    .... 
    yield 'data: %s\n\n' % message 

về phía khách hàng: thêm xử lý dỡ bỏ trang với SSE

$(window).unload(
    function() { 
    sse.close(); 
    } 
} 

Bất cứ điều gì là sai?

Bất kỳ đề xuất hoặc giải pháp nào có mã được đánh giá cao!

Cảm ơn trước!

Trả lời

2

Tôi đã gặp sự cố tương tự với Rails Live Controllers. Vấn đề là khung công tác dường như không phát hiện ra rằng kết nối được đóng cho đến khi nó cố gắng gửi một sự kiện tới máy khách.

Một cách tiếp cận là gửi các sự kiện "nhịp tim" định kỳ cho khách hàng. Tôi hiện đang sử dụng thành công này trên dự án Rails của tôi với một khoảng thời gian 60 giây. Tôi có một sợi riêng biệt "phát ra" những nhịp tim này vào Redis, mà bộ điều khiển của tôi đã đăng ký.

Một giải pháp thay thế cho phương pháp tiếp cận luồng, là để bọc khối pubsub Redis với thời gian chờ (một lần nữa, nói 60 giây). Và sau đó gửi sự kiện nhịp tim cho khách hàng - tiếp theo là một cuộc gọi pubsub khác. Nhược điểm của phương pháp này là bạn có thể bỏ lỡ một sự kiện trong khi bạn chưa đăng ký.

Có thêm thông tin về cách tiếp cận luồng tại đây: Redis + ActionController::Live threads not dying