asyncio python 3.6 代码到 asyncio python 3.4 代码

asyncio python 3.6 code to asyncio python 3.4 code

我有这个 3.6 异步代码:

async def send(command,userPath,token):
    async with websockets.connect('wss://127.0.0.1:7000',ssl=ssl.SSLContext(protocol=ssl.PROTOCOL_TLS)) as websocket:
        data = json.dumps({"api_command":"session","body":command,"headers": {'X-User-Path': userPath, 'X-User-Token': token}})
        await websocket.send(data)
        response = await websocket.recv()
        response = json.loads(response)
        if 'command' in response:
            if response['command'] == 'ACK_COMMAND' or response['command'] == 'ACK_INITIALIZATION':
                return (response['message'],200)
        else:
            return(response,400)

我将其转换为此 3.4 异步代码

@asyncio.coroutine
def send(command,userPath,token):
    with websockets.connect('wss://127.0.0.1:7000',ssl=ssl.SSLContext(protocol=ssl.PROTOCOL_TLS)) as websocket:
        data = json.dumps({"api_command":"session","body":command,"headers": {'X-User-Path': userPath, 'X-User-Token': token}})
        yield from websocket.send(data)
        response = yield from websocket.recv()
        response = json.loads(response)
        if 'command' in response:
            if response['command'] == 'ACK_COMMAND' or response['command'] == 'ACK_INITIALIZATION':
                return (response['message'],200)
        else:
            return(response,400)

虽然解释器 运行 进行了转换,但当我调用该函数时出现此错误:

with websockets.connect('wss://127.0.0.1:7000',ssl=ssl.SSLContext(protocol=ssl.PROTOCOL_TLS)) as websocket:
AttributeError: __enter__

我觉得要转换的东西更多,但我不知道是什么。我怎样才能使 3.4 代码工作?

注:我运行3.4的代码用了3.6python

可以发现 here of async with websockets.connect 你应该做的:

websocket = yield from websockets.connect('ws://localhost:8765/')
try:
    # your stuff
finally:
    yield from websocket.close()

你的情况是:

@asyncio.coroutine
def send(command,userPath,token):
    websocket = yield from websockets.connect('wss://127.0.0.1:7000',ssl=ssl.SSLContext(protocol=ssl.PROTOCOL_TLS))
    try:
        data = json.dumps({"api_command":"session","body":command,"headers": {'X-User-Path': userPath, 'X-User-Token': token}})
        yield from websocket.send(data)
        response = yield from websocket.recv()
        response = json.loads(response)
        if 'command' in response:
            if response['command'] == 'ACK_COMMAND' or response['command'] == 'ACK_INITIALIZATION':
                return (response['message'],200)
        else:
            return(response,400)
    finally:
        yield from websocket.close()