Использование Python веб-сокетов вне контекста - PullRequest
0 голосов
/ 24 марта 2020

Я создал сервер под управлением Flask -SocketIO, который обслуживает клиент Javascript, но я хочу реализовать asyncio, поэтому мне нужно изменить его на что-то вроде Quart с веб-сокетами.

Я запутался в веб-сокете контекст. Кажется, что каждая библиотека веб-сокетов (Quart, Flask -aiohttp, веб-сокеты) запускает веб-сокеты только в контексте того, что их создало, и я не могу использовать веб-сокеты во внешней функции, которая мне нужна делать. Я не могу просто поместить внешнюю функцию в функцию / маршрут websockets, потому что мне нужно вызывать ее из другого места. Вот пример использования библиотеки websockets:

async def echo(websocket, path):
    async for message in websocket:
        await websocket.send(message)

async def outside_function():

    # Some asynchronous stuff with aiohttp requests and file read/write

    # I want to have the websocket send messages here

    return some_result

websockets.serve(echo, 'localhost', 8765)

@app.route('/somepath', methods=['GET'])
def somepath_func():
    return outside_function(), 200

Я также думал об инициализации сервера websocket во внешнем интерфейсе, чтобы я мог передать сокет в качестве аргумента функции. Что-то вроде:

const wss = new WebSocket.Server({ port: 8765 })

wss.on('connection', ws => {
  ws.on('message', msg => console.log(msg))
})

А на заднем конце:

async def outside_function(websocket):

    # Some asynchronous stuff with aiohttp requests and file read/write

    websocket.send('some string')

    return some_result

@app.route('/somepath', methods=['GET'])
async def somepath_func():
    ws = await websockets.connect('ws://localhost:8765')
    return outside_function(ws), 200

Как правильно это сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...