Как я могу использовать уникальный запрос для каждого клиента, подключенного к веб-сокету - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь иметь только одно соединение с базой данных в своем веб-сокете и возвращать эту информацию каждому подключенному клиенту. Возможно ли это сделать?

Мой текущий код:

import asyncio
import aiopg
import websockets
import logging
import sys
import configparser

config = configparser.ConfigParser()
config.read('config/config.ini')

logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
logger = logging.getLogger('websockets.server')
logger2 = logging.getLogger('asyncio')
logger2.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler())
logger2.addHandler(logging.StreamHandler())

async def listen(websocket, path):

    async with aiopg.create_pool(config.get('default', 'connexion_bd'), maxsize=1, pool_recycle=0) as pool:
        async with pool.acquire() as conn1:
            async with conn1.cursor() as cur:

                await cur.execute(config.get('default', 'pg_listen'))
                while True:
                    msg = await conn1.notifies.get()
                    if msg.payload == 'finish':
                        return
                    else:
                        await websocket.send(msg.payload)


start_server = websockets.serve(listen, 'localhost', config.getint('default', 'port_websocket_server'))

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

В настоящее время каждый раз, когда клиент прослушивает мой веб-сокет, я получаю новое соединение в своей базе данных. Каждый клиент получит одинаковое содержимое, поэтому мне не нужно, чтобы он подключался к базе данных, только мой веб-сокет.

Я пытаюсь разделить свой код (подключиться к другому веб-сокету, который подключается к этому), но я получил та же проблема.

Любые советы будут оценены.

Спасибо

1 Ответ

0 голосов
/ 20 апреля 2020

Понял

Нужно поставить websocket.serve после запроса.

import asyncio
import functools

import aiopg
import websockets
import logging
import sys
import configparser

config = configparser.ConfigParser()
config.read('config/config.ini')

logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
logger = logging.getLogger('websockets.server')
logger2 = logging.getLogger('asyncio')
logger2.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler())
logger2.addHandler(logging.StreamHandler())

# Pour starter
# env/bin/python3 websocket_server_aiopg.py

USERS = set()


async def listen(websocket, path, conn1):
    USERS.add(websocket)

    while True:
        msg = await conn1.notifies.get()

        if msg.payload == 'finish':
            return
        else:
            await asyncio.wait(([user.send(msg.payload) for user in USERS]))


async def run_server():
    async with aiopg.create_pool(config.get('default', 'connexion_bd')) as pool:
        async with pool.acquire() as conn1:
            async with conn1.cursor() as cur:
                await cur.execute(config.get('default', 'pg_listen'))
                async with websockets.serve(functools.partial(listen, conn1=conn1), 'localhost', config.getint('default', 'port_websocket_server')) as ws:
                    await asyncio.sleep(1_000_000_000)  # consider waiting on an exit condition instead

asyncio.get_event_loop().run_until_complete(run_server())

...