当前位置: 首页 > 面试题库 >

如何在Flask框架中实现服务器推送?

高砚
2023-03-14
问题内容

我正在尝试使用Flask微网络框架上的服务器推送功能构建一个小型站点,但是我不知道是否有可以直接使用的框架。

我使用了Juggernaut,但在当前版本中似乎无法与redis-py一起使用,并且最近不推荐使用Juggernaut。

有人对我的案子有建议吗?


问题答案:

该协议非常简单。只需将mimetype添加text/event-stream到你的响应中即可。浏览器将保持连接打开并监听更新。从服务器发送的事件是一行文本,其开头是一个data:换行符。

data: this is a simple message
<blank line>

如果要交换结构化数据,只需将数据作为json转储并通过网络发送json。

优点是你可以在Flask中使用SSE,而无需额外的服务器。github上有一个简单的聊天应用程序示例,该示例使用redis作为发布/订阅后端。

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")

你无需使用gunicron即可运行示例应用程序。只需确保在运行应用程序时使用线程,否则SSE连接将阻塞你的开发服务器:

if __name__ == '__main__':
    app.debug = True
    app.run(threaded=True)

在客户端,你只需要一个Java处理程序函数,当从服务器中推送新消息时将调用该函数。

var source = new EventSource('/stream');
source.onmessage = function (event) {
     alert(event.data);
};

最近的Firefox,Chrome和Safari浏览器支持服务器发送事件。Internet Explorer尚不支持服务器发送的事件,但预期在版本10中将支持它们。建议使用两种Polyfills支持较旧的浏览器

  • EventSource.js
  • jquery.eventsource


 类似资料:
  • 问题内容: 我正在建立一个向访客提供一些信息的网站。通过每5秒轮询几个外部API,在后台汇总此信息。我现在使用它的方式是使用APScheduler作业。我最初喜欢APScheduler,因为它使整个系统更易于移植(因为我不需要在新计算机上设置cron作业)。我按以下方式启动轮询功能: 这有点用,但是有一些麻烦: 对于初学者,这意味着interval-jobs在Flask上下文之外运行。到目前为止,

  • 我正在尝试学习python来处理一个测试项目。是否有一种方法可以在python测试框架中实现类似功能的TestNG侦听器。 侦听器有诸如OnTestFailure()、OnTestSuccess、OnStart()等方法,当您想要做某些事情时,这些方法非常有用。 比方说,一个测试用例失败了,您想执行一些操作,比如截图。然后你可以只在一个地方写,而不是在每个测试方法中都写。

  • 问题内容: 我有一个Flask服务器,它从数据库中获取几个不同文件的二进制数据,并将它们放入python’zipfile’对象中。我想使用flask的“ send_file”方法将生成的zip文件与我的代码一起发送。 我最初能够通过使用BytesIO(bin)作为send_file的第一个参数来成功发送非zip文件,但是由于某些原因,我无法对生成的zip文件执行相同的操作。它给出了错误: ‘Zip

  • 问题内容: 在此处阅读有关服务器推送的信息。 我想将数据从Web应用程序实时推送到客户端。 我一直在将TCP套接字作为选项之一。 对于HTTP,我在这里找到了各种Java,PHP,Python和其他框架。但是我不知道这些工具是否支持Push。 您对实施服务器推送有什么建议和框架? 您会倡导使用哪种语言,为什么? 问题答案: 我现在正在使用Orbited,太好了! 如果您正在聊天或订阅类型的东西,请

  • 就像Flask拥有来实现迁移一样。猎鹰有类似烧瓶的东西吗?

  • 我想我错过了一些关于如何在JavaMail中搜索的内容。 从文件夹下载空邮件 创建与结果匹配的新搜索词 使用搜索词筛选(yourFolder.search)结果 这是可行的。但是,为什么要这样做?如果我使用javamail连接到gmail之类的东西,搜索不会在服务器端执行,而且使用整个javax似乎没有任何优势。邮政搜索SearchTerm构建在提高效率或减少需要通过网络发送的数据量方面。。。 我