gpt4 book ai didi

Python3.4读取内容流web请求

转载 作者:行者123 更新时间:2023-11-30 23:16:40 25 4
gpt4 key购买 nike

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

示例:

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

每 30 秒,我可以看到:

名称:值121数据:{'旧值':xx,'新值':xx}

我会提取 new_value。

最佳答案

实际上,在服务器和客户端上实现 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了解更多信息。

关于Python3.4读取内容流web请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27639356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com