Как смешать асинхронный сокет io с aiohttp - PullRequest
2 голосов
/ 15 апреля 2019

Я хочу написать http сервер с сокетом io. Что мне нужно:

request --> socket io ask -> socket io answer -> response

По запросу http я отправляю сообщение клиенту сокета io и жду ответного сообщения от сокета io. Затем отправьте это сообщение в виде ответа http или тайм-аута. Вот «начало работы» кода, который я хочу принять.

from aiohttp import web
import socketio

sio = socketio.AsyncServer()
app = web.Application()
sio.attach(app)

async def index(request):
    sio.emit('ask', 'some data')
    # here I want wait socket io answer
    return web.Response(..., content_type='text/plain')

@sio.on('connect', namespace='/chat')
def connect(sid, environ):
    print("connect ", sid)

@sio.on('answer', namespace='/chat')
async def answer(sid, data):
    # here I want send response to index or timeout
    ...

@sio.on('disconnect', namespace='/chat')
def disconnect(sid):
    print('disconnect ', sid)

app.router.add_get('/', index)

if __name__ == '__main__':
    web.run_app(app)

Я не понимаю, как связать часть http с сокетом io

1 Ответ

0 голосов
/ 16 апреля 2019

Вы можете использовать asyncio.Queue для этого:

from aiohttp import web
import socketio
import asyncio

queue = asyncio.Queue()  # create queue object
sio = socketio.AsyncServer()
app = web.Application()
sio.attach(app)

async def index(request):
    sio.emit('ask', 'some data')
    response = await queue.get()  # block until there is something in the queue
    return web.Response(response, content_type='text/plain')

@sio.on('connect', namespace='/chat')
def connect(sid, environ):
    print("connect ", sid)

@sio.on('answer', namespace='/chat')
async def answer(sid, data):
    await queue.put(data)  # push the response data to the queue

@sio.on('disconnect', namespace='/chat')
def disconnect(sid):
    print('disconnect ', sid)

app.router.add_get('/', index)

if __name__ == '__main__':
    web.run_app(app)

Примечание:

для обработки нескольких одновременных сеансов, вы должны создатьотдельный asyncio.Queue объект для каждой сессии.В противном случае клиенты могут получить данные, запрошенные в другом сеансе.

...