Подайте поток SSE из "живой" deque - PullRequest
0 голосов
/ 18 января 2020

Используя SSE и javascript EventSource, я пытаюсь создать функцию генератора, которая будет передавать уведомление клиенту с помощью Flask Response (). Я заставил это работать большую часть времени, но я теряю некоторые уведомления, которые выдаются, но не принимаются браузером ...

Я много читал о функции генератора, но не могу заставить ее работать должным образом. Я, наверное, упускаю что-то очевидное, но, потратив на это все свое свободное время, я решил обратиться за помощью. ; -)

Вот мой класс очереди уведомлений, использующий deque с моей функцией / методом генератора read ():

class EventStream:
    """
    This class is used to read or write items to the notifications deque.
    """

    def __init__(self):
        self.queue = deque(maxlen=100)

    def write(self, type=None, action=None, series=None, episode=None, movie=None):
        msg = {"type": type, "action": action, "series": series, "episode": episode, "movie": movie}
        self.queue.append("data: " + json.dumps(msg) + "\n\n")

    def read(self):
        while True:
            while self.queue:
                yield self.queue.popleft()

event_stream = EventStream()

Вот мой Flask Ответ:

return Response(event_stream.read(), mimetype="text/event-stream", content_type="text/event-stream")

Вот мой javascript:

events = new EventSource('{{ url_for('api.events') }}');
events.onmessage = function (event) {
    var event_json = JSON.parse(event.data);
    ... working with event_json data...
};

Есть идеи, что мне здесь не хватает? Спасибо!

...