2014-12-24 4 views
1

Как в Python3.4 я могу прочитать данные из веб-запроса, который является потоком событий в качестве типа контента? Данные потока обновляются каждые 30 секунд, и для каждого из них я извлекал и обрабатывал данные.Python3.4 прочитал веб-запрос потока контента

Пример:

я выполнил запрос на http://example.com/value121 В заголовках, можно увидеть: Content-Type: текст/событие потока

Каждый 30s, можно увидеть:

имя : value121 данные: {'old_value': xx, 'new_value': xx}

И я бы извлек new_value.

Спасибо,

+2

Ваш вопрос слишком широк, может предоставить более подробную информацию? что вы пробовали? в чем цель? –

+0

Можете ли вы указать фактический URL? – nneonneo

ответ

1

Дает sseclient попробовать: он обрабатывает сообщения SSE, используя простой интерфейс итератора стиля.

+0

Спасибо, sseclient идеально подходит для меня. – Matt

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 для получения дополнительной информации.

Смежные вопросы