Я создаю простой HTTP-веб-сервис, но хочу отправить информацию через веб-сокет на другой сервер.
Например, когда веб-сервис получает запрос на /foo
, он отправляет наwebsocket "request on /foo received"
.
Я довольно новичок в асинхронном программировании на Python.Я выбираю aiohttp
для этого, но это не сложное требование.
У меня есть некоторый предыдущий опыт работы с websocket и autobahn
, и я сначала попытался смешать aiohtpp
и autobahn
.Я даже нашел пример с обоими, но он использовал wamp
, и я просто хочу веб-сокет.
Затем я попытался без autobahn
как aiohttp
обрабатывать веб-сокет.
Моя последняя попытка выглядит следующим образом:
from aiohttp import web, ClientSession, WSMsgType
async def callback(msg):
print(msg)
async def websocket(session):
async with session.ws_connect('http://localhost:8000') as ws:
app['ws'] = ws
async for msg in ws:
if msg.type == WSMsgType.TEXT:
await callback(msg.data)
elif msg.type == WSMsgType.CLOSED:
break
elif msg.type == WSMsgType.ERROR:
break
async def hello(request):
app.ws.send_str('{"hello": "world"}')
return web.Response(text="Hello, world")
async def init(app):
session = ClientSession()
app['websocket_task'] = app.loop.create_task(websocket(session))
app = web.Application()
app.add_routes([web.get('/', hello)])
app.on_startup.append(init)
web.run_app(app, port=7000)
При запросе /
он обналичивается со следующим исключением: AttributeError: 'Application' object has no attribute 'ws'
Как я могу смешивать обслуживание http и запись на веб-сокете какклиент?Это вообще возможно?