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

Другие вопросы по тегам