Компонент, совместимый с 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), я просто хочу, чтобы это как-то работало.


person deceze♦    schedule 16.02.2015    source источник


Ответы (1)


WSGI — это по своей сути синхронный API. Я не знаю о Pulsar, но я был бы удивлен, если бы он мог каким-то волшебным образом обойти этот факт.

Способ 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 по сути создан по образцу Flask, но на уровне исходного кода. У нас есть сообщение в блоге, посвященное именно этому: Смешивание кода Web и WAMP с Twisted Klein

person oberstet    schedule 16.02.2015
comment
Мне нужно предоставить конечную точку REST третьей стороне, которая может связаться со мной только через старый добрый HTTP. В этой конечной точке мне нужно доставить данные, которые передаются с помощью WAMP в моем приложении Crossbar. В идеале я хотел бы постоянно запускать компонент, который подписан на определенную тему, заполняет свои внутренние данные из сообщений в этой теме и доставляет эти данные через HTTP по запросу. И все на том же сервере Crossbar, если это возможно. В противном случае мне придется настроить какой-то внешний метод передачи/хранения данных. Может ли Кляйн сделать это, работая как WSGI? - person deceze♦; 16.02.2015
comment
Да, Кляйн упростит это (например, 50 LOC). С Кляйном нет WSGI. Он просто создает ресурс Twisted Web, который выглядит и работает как Flask (но не Flask и не WSGI). Чтобы подключить это к Crossbar.io github.com/crossbario/crossbar/issues/247 - person oberstet; 16.02.2015
comment
Еще одно замечание: когда мост REST будет полностью готов, вы сможете вызывать любую процедуру WAMP через простые старые HTTP/POST. Просто по настройке Crossbar.io - ни строчки кода. Однако последнее событие, опубликованное в какой-либо теме (в настоящее время), недоступно из встроенной процедуры. Таким образом, вам все равно понадобится крошечный компонент WAMP, который будет подписываться на тему, запоминать событие и предоставлять единую процедуру для вызова через HTTP/POST/REST-Bridge. - person oberstet; 16.02.2015
comment
Я очень жду этого, но мне нужно решение сейчас. :) Кляйна посмотрю, спасибо. Однако не похоже, что это возможно на самом деле подключить к Crossbar сегодня, не так ли? - person deceze♦; 17.02.2015
comment
На самом деле у меня уже было что-то, работающее над asyncio Tornado + Autobahn, теперь я переписал это в Twisted + Klein, ожидая, что в конечном итоге смогу подключить его к Crossbar. До тех пор мне просто придется запускать его как гостя на другом порту, верно? - person deceze♦; 17.02.2015
comment
Точно. Вы можете запустить его в качестве гостя (под управлением Crossbar.io) или полностью независимо. И да: возможности запустить его как веб-ресурс под Crossbar.io сегодня нет. Это тривиально реализовать. Я вижу, что я могу сделать. Когда он есть, он покупает вам возможность запускать приложение Klein на том же порту, что и маршрутизатор WAMP. - person oberstet; 17.02.2015
comment
Большое спасибо! Этого достаточно на данный момент и для намеченной цели; но в конечном итоге мне бы очень хотелось иметь унифицированный сервер и структуру URL. :) - person deceze♦; 17.02.2015