Python Bottle SSE

标签 python bottle server-sent-events

我正在尝试让服务器发送事件在Python中工作,所以我找到了一些演示代码,令我惊讶的是,它只部分工作,我不明白为什么。我从here获取代码并进行了一些小的更改,这样我就可以看到什么在起作用(我包括了一个 print 语句,一个他们显然忘记的 import 语句,并将他们的 HTML 清理为我可以更容易阅读的内容)。现在看起来像这样:

# Bottle requires gevent.monkey.patch_all() even if you don't like it.
from gevent import monkey; monkey.patch_all()
from gevent import sleep

from bottle import get, post, request, response
from bottle import GeventServer, run
import time


sse_test_page = """
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/1.8.3/jquery.min.js "></script>
        <script>
            var es = new EventSource("/stream");
            es.onmessage = function(e) {
                document.getElementById("log").innerHTML = e.data;
            }
        </script>
    </head>
    <body>
        <h1>Server Sent Events Demo</h1>
        <p id="log">Response Area</p>
    </body>
</html>
"""


@get('/')
def index():
    return sse_test_page


@get('/stream')
def stream():
    # "Using server-sent events"
    # https://developer.mozilla.org/en-US/docs/Server-sent_events/Using_server-sent_events
    # "Stream updates with server-sent events"
    # http://www.html5rocks.com/en/tutorials/eventsource/basics/

    response.content_type  = 'text/event-stream'
    response.cache_control = 'no-cache'

    # Set client-side auto-reconnect timeout, ms.
    yield 'retry: 100\n\n'

    n = 1

    # Keep connection alive no more then... (s)
    end = time.time() + 60
    while time.time() < end:
        yield 'data: %i\n\n' % n
        print n
        n += 1
        sleep(1)


if __name__ == '__main__':
    run(server=GeventServer, port = 21000)

所以最终发生的事情是这样的:我可以在网站上看到原始标题和段落,但响应区域永远不会改变。在 python 方面,它每秒打印一次 n ,但我从未在网页上看到这种变化。我觉得我只是对自己想做的事情缺乏基本的了解,但我找不到任何遗漏的东西。

我正在运行 Python 2.7、Windows 7、Chrome 43.0.2357.81 m。

编辑:我去掉了多余的引号。现在似乎只有在达到 60 时才会更新(我想这总比不更新要好……) 为什么要等到函数结束才发送事件?

最佳答案

p id="log""之后有 2 组引号

关于Python Bottle SSE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30490200/

相关文章:

ubuntu - 使用 curl 测试 Bottle api

python - 二进制文件下载

websocket - 现在,Comet是否已被服务器发送的事件和WebSocket淘汰了?

javascript - Firefox 不处理服务器发送的事件方法

python - 在 Python 中读取 .tar.gz 文件

python - VBA如何使用部分参数调用另一个函数内的函数

python - 旅行所有城市所需的最短天数

python - 使用 Python 更新 JSON 文件中的值

python - 使用 mod_wsgi 进行 HTTP 基本身份验证

node.js - Websocket 传输可靠性(重新连接期间的 Socket.io 数据丢失)