WSGI-совместимый компонент с клиентом веб-сокета?
Я пытаюсь интегрировать респондент RESTful в приложение Crossbar, для которого лучше всего подходит служба WSGI. В идеале, эта служба должна быть частью остальной инфраструктуры pub/sub, чтобы иметь возможность получать события WAMP с одной стороны и отвечать на HTTP-запросы с другой.
Сложность состоит в том, чтобы запустить цикл обработки событий, который допускает асинхронные события веб-сокетов и дополнительно предлагает компонент, совместимый с WSGI. Мне кажется, что Pulsar должен быть в состоянии сделать это, но я не смог выяснить, как его настроить, ни один из доступных образцов не демонстрирует именно этот вариант использования.
value = None
class Foo(ApplicationSession):
def onJoin(self, details):
yield self.subscribe(self.bar, 'bar')
def bar(self, data):
value = data
app = Flask(__name__)
@app.route('/')
def baz():
return value
if __name__ == '__main__':
runner = ApplicationRunner('ws://127.0.0.1:8080', 'test')
runner.run(Foo, start_reactor=False)
# now what?
Выше демонстрируются две части: клиент Autobahn WAMP и компонент Flask WSGI. Как мне запустить их оба параллельно, позволяя одному потоку получать события как через HTTP, так и через веб-сокет? Меня не особо волнует ни версия Python, ни базовая библиотека (Twisted, asyncio, Pulsar, Flask), я просто хотел бы как-нибудь запустить это.
1 ответ
WSGI является по своей сути синхронным API. Я не знаю насчет Пульсара, но я был бы удивлен, если бы он каким-то волшебным образом обошел этот факт.
http://crossbar.io/ интегрируется с классическими (и синхронными) стеками через REST-мост. В настоящее время мы выполняем роль WAMP "Издатель" (2015/02): то есть вы можете опубликовать событие WAMP, выполнив простой HTTP / POST http://crossbar.io/docs/HTTP-Pusher-Service/, Этот мост REST в Crossbar.io будет расширен, чтобы охватить все 4 роли WAMP в ближайшем будущем.
Если вы сделаете шаг назад и в первую очередь заботитесь о том, чтобы создать REST API в вашем приложении, которое напрямую интегрируется с WAMP и асинхронными компонентами, я бы посмотрел Twisted Klein. Twisted Klein по сути моделируется после Flask, но на уровне источника. У нас есть пост в блоге, который посвящен именно этому: смешивание кода Web и WAMP с помощью Twisted Klein