首页 文章

aiohttp Websocket客户端和HTTP服务器

提问于
浏览
1

我正在编写一个需要从两个来源接收事件的应用程序 . 某些事件将来自Websocket客户端连接,而某些事件将来自传入的HTTP请求 . 是否可以使用aiohttp在同一个应用程序中同时拥有这两个侦听器,还是需要两个单独的可执行文件?

我目前有一个功能,它接受websocket事件,并在每个事件上调用一个回调

async def callback(msg):
    print(msg)

async def websocket():
    session = aiohttp.ClientSession()
    async with session.ws_connect('http://example.org/websocket') as ws:

        async for msg in ws:
            if msg.type == aiohttp.WSMsgType.TEXT:
                await callback(msg.data)
            elif msg.type == aiohttp.WSMsgType.CLOSED:
                break
            elif msg.type == aiohttp.WSMsgType.ERROR:
                break

问题是这会永远阻塞,所以我不知道如何将它与aiohttp服务器集成 . 如果我做:

await websocket()
aiohttp.web.run_app(app)

然后 web.run_app 永远不会被调用 . 有没有办法实现这个目标?这似乎是asyncio的理想情况,多个事件异步处理多个事件 . 我该怎么做?

1 回答

  • 2

    我能够通过使用我的aiohttp应用程序的 on_startup 处理程序来实现我的目标 .

    async def callback(msg):
        print(msg)
    
    async def websocket(session):
        async with session.ws_connect('http://example.org/websocket') as ws:
            async for msg in ws:
                if msg.type == aiohttp.WSMsgType.TEXT:
                    await callback(msg.data)
                elif msg.type == aiohttp.WSMsgType.CLOSED:
                    break
                elif msg.type == aiohttp.WSMsgType.ERROR:
                    break
    
    async def init(app):
        session = aiohttp.ClientSession()
        app['websocket_task'] = app.loop.create_task(websocket(session))
    
    app = web.Application()
    app.on_startup.append(init)
    

相关问题