![](/img/trans.png)
[英]How to send data through a client websocket in a aiohttp request handler
[英]aiohttp Websocket client and HTTP server
我正在编写一个需要从两个来源获取事件的应用程序。 一些事件将来自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
。 有什么办法可以做到这一点? 似乎是异步的理想情况,多个事物异步处理多个事件。 我该怎么做?
通过使用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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.