【问题标题】:Python3.4 read content stream web request [closed]Python3.4读取内容流网络请求[关闭]
【发布时间】:2014-12-24 15:53:49
【问题描述】:

如何在 Python3.4 中从作为内容类型的事件流的 Web 请求中读取数据? 流数据每 30 秒更新一次,我会为每个数据提取和处理数据。

例子:

我在http://example.com/value121 上执行了一个请求 在标题中,我可以看到: content-type: text/event-stream

每 30 岁,我可以看到:

名称:value121 数据:{'old_value': xx, 'new_value': xx}

我会提取 new_value。

谢谢,

【问题讨论】:

  • 你的问题太笼统了,能详细点吗?你试过什么?目的是什么?
  • 你能给出一个实际的网址吗?

标签: python stream httprequest


【解决方案1】:

试一试sseclient:它使用简单的迭代器样式接口处理 SSE 消息。

【讨论】:

  • 谢谢,sseclient 非常适合我。
【解决方案2】:

在服务器和客户端上实现text/event-stream 实际上相对容易。假设example.com 的服务器是在端口80(默认端口)上运行的这个简单服务器:

import http.server
import json
import socketserver
import time

class RequestHandler(http.server.SimpleHTTPRequestHandler):

    def do_GET(self):
        self.send_response(200)
        self.send_header('Connection', 'Keep-Alive')
        self.send_header('Content-Type', 'text/event-stream')
        self.end_headers()

        name = self.path.strip('/').encode('UTF-8')

        old_value = None
        new_value = None
        while True:
            old_value, new_value = new_value, time.time()
            data = json.dumps({
                'old_value': old_value,
                'new_value': new_value,
            }).encode('UTF-8')
            self.wfile.write(b'name: ')
            self.wfile.write(name)
            self.wfile.write(b'\r\n')
            self.wfile.write(b'data: ')
            self.wfile.write(data)
            self.wfile.write(b'\r\n')
            self.wfile.write(b'\r\n')
            self.wfile.flush()
            time.sleep(30)

server = socketserver.TCPServer(('', 80), RequestHandler)
server.serve_forever()

每 30 秒,它输出一个事件:

name: value121<CR><LF>
data: {"old_value": <old-timestamp>, "new_value": <new-timestamp>}<CR><LF>
<CR><LF>

然后,客户端可以在端口80 上连接到http://example.com/value121 并解析每个事件:

import http.client
import json

connection = http.client.HTTPConnection('http://example.com', 80)
connection.request('GET', '/value121', headers={
    'Accept': 'text/event-source',
    'Connection': 'Keep-Alive',
})
with connection.getresponse() as response:
    while not response.closed:
        event = {}
        for line in response:
            line = line.decode('UTF-8')
            if line == '\r\n':
                # End of event.
                break
            elif line.startswith(':'):
                # Comment, ignore.
                pass
            else:
                # Data line.
                key, value = line.split(':', 1)
                value = value.strip()
                if key == 'data':
                  value = json.loads(value)
                event[key] = value

        # Handle event, extract values, etc.
        print(event)

客户端每 30 秒打印一次:

'data': {'old_value': <old-timestamp>, 'new_value': <new-timestamp>}, 'name': 'value121'}

注意:这是一个非常基本的实现。请参阅Using server-sent events § Event stream format 了解更多信息。

【讨论】:

    猜你喜欢
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    相关资源
    最近更新 更多