专栏名称: Python之美
《Python web开发实战》作者的公众号。发现Python之美,主要包含Web开发、Python进阶、架构设计、Python开发招聘信息等方面内容
目录
相关文章推荐
51好读  ›  专栏  ›  Python之美

wechat-admin:SSE

Python之美  · 公众号  · Python  · 2017-08-14 20:49

正文

在上一篇项目设计中,我说到了SSE(Server-Sent Events)是为了实现单方向的消息推送,今天介绍下实际的使用。

我直接用了现成的Flask-SSE,其实SSE实现的原理比较简单:

  1. 借用Redis的发布/订阅模式创建一个方法,方法内会调用pubsub.listen监听新的发布数据。

  2. 使用Flask提供的stream_with_context,不断的从上面的方法中获取数据。

使用起来分2部分

前端

在前端页面添加一个函数:

  1. function eventSourceListener() {

  2.    let source = new EventSource(`${API_URL}/stream`);

  3.    let self = this;

  4.    source.addEventListener('login', function(event) {

  5.        let data = JSON.parse(event.data);

  6.        if (data.type == 'scan_qr_code') {

  7.            self.uuid = data.uuid;

  8.            self.qrCode = `data:image/png;base64,${data.extra}`;

  9.        } else if (data.type == 'confirm_login') {

  10.            self.sub_title = 'Scan successful';

  11.            self.sub_desc = 'Confirm login on mobile WeChat';

  12.            self.qrCode = data.extra;

  13.        } else if (data.type == 'logged_in') {

  14.            sessionStorage .setItem('user', JSON.stringify(data.user));

  15.            self.$router.push({ path: '/main' });

  16.        } else if (data.type == 'logged_out') {

  17.            sessionStorage.removeItem('user');

  18.            self.$router.push('/login');

  19.        }

  20.    }, false);

  21.    source.addEventListener('notification', function(event) {

  22.        let data = JSON.parse(event.data);

  23.        self.notificationCount = data.count;

  24.    }, false);

  25.    source.addEventListener('error', function(event) {

  26.        console.log("Failed to connect to event stream");

  27.    







请到「今天看啥」查看全文