Как реализовать websocket внутри класса? - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь использовать websocket.WebSocketApp внутри класса, чтобы позже я мог использовать данные, полученные из веб-сокета:

import requests
from urlparse import (urlparse, parse_qs)
import json
import websocket

class NeuroStream:

    def __init__(self, sensor, token):
    self._sensor = sensor
    self.token = token
    self.buf = []
    return

    def stream(self):
        self.ws = websocket.WebSocketApp(
            "wss://api.foofoo.com/api/v1/features/" + self._sensor
            + "/real-time/?all=true&access_token=" + self.token,
            on_message=self.on_message,
            on_error=self.on_error,
            on_close=self.on_close)
        self.ws.run_forever()

    def on_error(self, error):
        print(error)

    def on_close(self):
        print "connection lost"

    def on_message(self, message):
        message = json.loads(message)
        biomarkers = message[u'features']
        c1 = biomarkers[u'c1']
        self.buf.append(c1)

Когда я определяю функции on_error, on_close и on_message вне области действия класса, заменяю self на ws и опускаю self в их вызовах, это работает. Но тогда я не могу использовать

self.buf.append(c1)  

Что является ключевым для последующего использования

Edit: Код, который я запускаю перед ошибкой, а также перед делом, которое работает:

from NeuroStream import *
ns = NeuroStream('a_sensor', 'a_token')
ns.stream()

Я получаю ошибку:

'Не удалось найти обработчики для регистратора "websocket"'

Я видел похожую ветку, но это не помогло: Использование клиента веб-сокета в качестве класса в Python

1 Ответ

0 голосов
/ 03 июля 2018

Я заметил две проблемы.

1) "wss://api.foofoo.com/api/v1/features/" + self.sensor должно быть "wss://api.foofoo.com/api/v1/features/" + self._sensor, поскольку вы определили self._sensor = sensor во время инициализации.

2) Похоже, вы пытаетесь использовать клиентскую функцию библиотеки websocket. Попробуйте установить websocket-client, как показано ниже, а затем повторно запустите код.
pip install websocket-client

Код работает для меня с двумя вышеуказанными изменениями.

Python 2.7.14 (default, Mar 22 2018, 14:43:05) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from aam import NeuroStream
>>> ns = NeuroStream('a_sensor', 'a_token')
>>> ns.stream()
>>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...