У меня есть программа на Python, которая при определенном событии (например, при запросе curl) будет вычислять значение функции. Мне нужно, чтобы в момент выполнения функции некоторые данные должны быть отправлены в веб-узел торнадо. Я просмотрел Интернет и нашел примеры того, как создать веб-сокет, но все эти примеры охватывают сценарии, в которых данные вызываются внутри обработчика веб-сокета.
Ссылаясь на этот код, например: https://github.com/benjaminmbrown/real-time-data-viz-d3-crossfilter-websocket-tutorial/blob/master/rt-data-viz/websocket_server.py
Может ли кто-нибудь посоветовать мне, как я могу опубликовать сообщение в веб-сокете. В основном у меня есть API торнадо, где, если пользователь выполняет запрос на завиток, я хотел бы записать это сообщение в веб-сокет
Вы можете сделать это, создав реестр всех активных веб-сокетов и используя его для отправки сообщений о каком-либо событии.
class WebsocketRegistry:
def __init__(self):
self._active_websockets = []
def add_listener(self, listener):
self._active_websockets.append(listener)
def remove_listener(self, listener):
self._active_websockets.remove(listener)
def send_messages(self, msg_txt):
for ws in self._active_websockets:
ws.write_message(msg_txt)
registry = WebsocketRegistry()
class WSHandler(tornado.websocket.WebSocketHandler):
def open(self, *args, **kwargs):
super(WSHandler, self).open(*args, **kwargs)
registry.add_listener(self)
def on_close(self):
super(WSHandler, self).on_close()
registry.remove_listener(self)
P.S. Обратите внимание, что если вы планируете масштабировать свое приложение с помощью 2+ экземпляров, это не сработает, и вам придется использовать, например, очередь сообщений (RabbitMQ подходит) для доставки событий во все открытые веб-сокеты. Но общий подход будет таким же: MQ будет реестром, а веб-сокеты будут подписываться на сообщения (и отказываться от подписки при закрытии) при подключении.