Доброго времени суток.
Занимаюсь 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?
Спасибо.