aiohttp.web + WebSockets

280 views
Skip to first unread message

yaroslav....@gmail.com

unread,
Oct 9, 2016, 8:06:19 AM10/9/16
to aio-libs
Доброго времени суток.
Занимаюсь Python около месяца, пока исходники мне ничего не говорят.
В качестве тренировки, решил "запилить" маленькое, но очень нужное для моей работы приложение, которое получает статистику (в реальном времени) с машин в локалке и является web сервером для удобного отображения этой информации + изменения настроек приложения в браузере (дальше - хранение в БД),. Остановился на aiohttp - это очень круто и удобно, главное, без лишних сущностей, мне нужно было просто заходить браузером по-адресу, чтобы не открывать файл html для соединения websocket (т.е. отдавать index.html, статику; работать через websocket), я пришел к выводу: aiohttp - лучший способ сделать это. Мое скромное мнение, с такой библиотекой лучшим интерфейсом для практически любого приложения будет браузер.

import asyncio
from aiohttp import web
from aioxmlrpc.client import ServerProxy
import json


_config = {
'intervalSendFarmsInfo': 1,
'intervalReceiveFarmsInfo': 1
}

_cardsInfo = ''


async def handle(request):
file = open('./webClient/index.html', 'rb')
return web.Response(body=file.read(), content_type='text/HTML')


async def handler_ws(request):
ws = web.WebSocketResponse()

await ws.prepare(request)

async for msg in ws:

if msg.type == web.MsgType.text:
global _config
_config.update(json.loads(msg.data))
print(_config)

elif msg.type == web.MsgType.binary:
pass
# ws.send_bytes(msg.data)
elif msg.type == web.MsgType.close:
break

return ws


async def handler_xmlrpc():
while True:
await asyncio.sleep(_config['intervalReceiveFarmsInfo'])
proxy = ServerProxy('http://192.168.1.41:8085/')
global _cardsInfo
_cardsInfo = await proxy.getInfo()
print(_cardsInfo)


if __name__ == '__main__':

loop = asyncio.get_event_loop()

app = web.Application(loop=loop)
app.router.add_get('/', handle)
app.router.add_get('/ws', handler_ws)
app.router.add_static('/', './webClient')

server = loop.create_server(app.make_handler(), '', 80)
loop.run_until_complete(server)

loop.run_until_complete(handler_xmlrpc())

loop.run_forever()

Сейчас клиенты опрашиваются xmlrpc, потому что клиентская часть работает. Впоследствии будут на сокетах.

1) Настройки приложения хранятся в глобальной переменной, правильно ли я понимаю, что лучше положить их в web.Application?

Пересмотрел, наверное, все видео про aiohttp с участием Андрея Светлова на различных конференциях, в одном из них, Андрей упомянул, что в обработчике сообщения websocket, после чтения и ws.prepare(request), websocket прикрывается. Я вижу в браузере, что это не так и сокет остается открытым, как и должно быть.
Хочу уйти от "запрос-ответ".

2) Как и где "поймать" открытый websocket (после handshake), чтобы сделать корутину, которая будет слать браузеру в сокет какую-то инфу с заданной переодичностью?

3) Достаточно-ли корректно реализована корутина запроса xmlrpc?

Спасибо.

Nickolai Novik

unread,
Oct 9, 2016, 8:37:58 AM10/9/16
to yaroslav....@gmail.com, aio-libs
Привет.
1) Верно, web.Application как раз для этого и создан.
2) В репозитории aiohttp есть демка, которая использует websockets для чата (https://github.com/KeepSafe/aiohttp/tree/master/demos/chat). Ее можно переделать для переодических сообщений.
3) слабо знаком с aioxmlrpc, но избавтся от глобальной переменной необходимо.

В общем схема может быть следующей, как в демке с чатом нужно сохранить все живые сокеты в web.Application. В обработчик  handler_xmlrpc пробросить web.Application и там с заданным интревалом, итерироваться по открытым сокетам и отправлять сообщение.



--
You received this message because you are subscribed to the Google Groups "aio-libs" group.
To unsubscribe from this group and stop receiving emails from it, send an email to aio-libs+u...@googlegroups.com.
To post to this group, send email to aio-...@googlegroups.com.
Visit this group at https://groups.google.com/group/aio-libs.
To view this discussion on the web visit https://groups.google.com/d/msgid/aio-libs/a1e94608-609e-47c7-bad5-55cb5e4b2a43%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages