基于Tornado,SSE在Python中的实现

9 篇文章 0 订阅
7 篇文章 1 订阅
SSE前端代码
var source = new EventSource("{{proxy_url('/editpage/code/execute')}}");
source.onmessage = function(event) {
    var message = event.data;
    // do stuff based on received message
    console.log(message);
};
SSE后台代码
class SSEHandler(BaseHandler):
    def __init__(self, application, request, **kwargs):
        super().__init__(application, request, **kwargs)
        self._loop = None
        self._last_id = None

    def initialize(self):
        self.set_header("Content-Type", "text/event-stream")
        self._auto_finish = False

    @gen.coroutine
    def emit(self, source):
        if not isinstance(source, DataSource):
            raise ValueError("source not a instance of DataSource")
        if self._last_id == source.id:
            self.log.warning("last send id:%s same,ignore", self._last_id)
            return
        try:
            self.write(source.text())
            yield self.flush()
        except StreamClosedError as e:
            self._loop.stop()
            self.finish()
            self.log.warning(e)
        except RuntimeError as e:
            self._loop.stop()
            self.finish()
            self.log.warning(e)

    def render_emitter(self, func, period=1000, *args, **kwargs):
        self._loop = PeriodicCallback(lambda: {self.emit(func(*args, **kwargs))}, period)
        self._loop.start()


class DataSource(object):
    """Generic object for producing data to feed to clients."""

    def __init__(self, initial_data=None):
        self._id = uuid.uuid4().hex
        self._event = None
        self._data = initial_data
        self._retry = None
        self._comment = None

    @property
    def id(self):
        return self._id

    @property
    def event(self):
        return self._event

    @property
    def data(self):
        return self._data

    @property
    def retry(self):
        return self._retry

    @property
    def comment(self):
        return self._comment

    def text(self):
        msg = ""
        if self._id:
            msg += "id:" + self._id + "\n"

        if self._event:
            msg += "event:" + self._event + "\n"

        if self._comment:
            msg += ":" + self._comment + "\n"

        if self._data:
            msg += "data:" + json.dumps(self._data) + "\n\n"

        return msg
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值