Python3.4读取内容流Web请求

时间:2014-12-24 15:53:50

标签: python stream httprequest

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

示例:

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

每30秒,我可以看到:

name:value121 数据:{' old_value':xx,' new_value':xx}

我会提取new_value。

谢谢,

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

在服务器和客户端上实现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>

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

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