Вот один из способов обслуживать как веб-сокеты, так и http-запросы на одном сервере.Единственная разница с тем, что вы предложили, заключается в том, что оба обработчика прослушивают один и тот же порт.
Я считаю, что можно прослушивать отдельные порты, определив два приложения aiohttp
.Тем не менее, в любом случае вам понадобится HTTP-сервер с поддержкой asyncio.AFAIK HTTPServer
имеет , а не с поддержкой асинхронности, поэтому предлагаемое решение не может работать, поскольку вы смешиваете асинхронный сервер (websockets.serve
) с неасинхронным (HTTPServer
).
#!/usr/bin/python3.7
import aiohttp
from aiohttp import web, WSCloseCode
import asyncio
async def http_handler(request):
return web.Response(text='Hello, world')
async def websocket_handler(request):
ws = web.WebSocketResponse()
await ws.prepare(request)
async for msg in ws:
if msg.type == aiohttp.WSMsgType.TEXT:
if msg.data == 'close':
await ws.close()
else:
await ws.send_str('some websocket message payload')
elif msg.type == aiohttp.WSMsgType.ERROR:
print('ws connection closed with exception %s' % ws.exception())
return ws
def create_runner():
app = web.Application()
app.add_routes([
web.get('/', http_handler),
web.get('/ws', websocket_handler),
])
return web.AppRunner(app)
async def start_server(host="127.0.0.1", port=1337):
runner = create_runner()
await runner.setup()
site = web.TCPSite(runner, host, port)
await site.start()
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(start_server())
loop.run_forever()