ASYNCIO PYTHON 3.6代码为Asyncio Python 3.4代码



我有此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.6 Python

运行3.4代码

在此处可以找到的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()

最新更新