Python асинхронный метод Websocket возвращает Future

#python-3.x #websocket #python-asyncio

#python-3.x #websocket #python-asyncio

Вопрос:

У меня есть async метод, который я пытаюсь использовать для возврата данных из интерфейса веб-сокета приложения NodeJS.

Когда метод выполняется, я просто получаю <Future pending> сообщение внутри объекта websockets.

Что мне нужно изменить, чтобы метод получал и печатал фактическое сообщение с сервера?

 import asyncio
import json
import asyncws
import websockets
import requests

...
...
...

async def inject():
    ws = await asyncws.connect(url   get_sid())
    print("Sending...")

    payload = base_query   f"(SELECT substring((SELECT token FROM AuthTokens WHERE UserId = 1),1,1))=3 #"
    payload = string_to_json(payload, token)
    payload = f'42["checkEmail", {payload}]'

    ws.send(payload)
    print("Sent...")

    print("Receiving...")
    reply = ws.recv()

    if reply is None:
        print("NoneType reply")
    else:
        print(reply)
        for r in reply:
            print(r)

asyncio.get_event_loop().run_until_complete(inject())
asyncio.get_event_loop().close()
 

Вывод:

 Sending...
Sent...
Receiving...
<generator object Websocket.recv at 0x7fbb1813eb30>
<Future pending>
 

Комментарии:

1. Вам нужно поставить await перед обоими ws.send ws.recv вызовами and .

Ответ №1:

Websockets использует Python asyncio для управления параллелизмом и вводом-выводом.

websocket.send И websocket.recv являются асинхронными функциями. Это означает, что вам нужно await использовать их, чтобы получить значение.

В вашем коде вам нужно изменить ws.send(payload) на await ws.send(payload) и ws.recv() на await ws.recv() .

Вы можете прочитать документацию для Websockets здесь: https://websockets.readthedocs.io/en/stable/api.html#websockets.protocol .websocketcommon protocol.recv