tôi có mã này tương tác với một api WebSocket sử dụng async
và websokets
thư viện python:Làm thế nào để giữ phiên còn sống khi sử dụng các websockets không đồng bộ?
#!/usr/bin/env python3
import sys, json
import asyncio
from websockets import connect
class AsyncWebsocket():
async def __aenter__(self):
self._conn = connect('wss://ws.myws.com/v2')
self.websocket = await self._conn.__aenter__()
return self
async def __aexit__(self, *args, **kwargs):
await self._conn.__aexit__(*args, **kwargs)
async def send(self, message):
await self.websocket.send(message)
async def receive(self):
return await self.websocket.recv()
class mtest():
def __init__(self, api_token):
self.aws = AsyncWebsocket()
self.loop = asyncio.get_event_loop()
self.api_token = api_token
self.authorize()
def authorize(self):
jdata = self.__async_exec({
'authorize': self.api_token
})
try:
print (jdata['email'])
ret = True
except:
ret = False
return ret
def sendtest(self):
jdata = self.__async_exec({
"hello": 1
})
print (jdata)
def __async_exec(self, jdata):
try:
ret = json.loads(self.loop.run_until_complete(self.__async_send_recieve(jdata)))
except:
ret = None
return ret
async def __async_send_recieve(self, jdata):
async with self.aws:
await self.aws.send(json.dumps(jdata))
return await self.aws.receive()
Vì vậy, tôi đã điều sau đây trong main.py:
from webclass import *
a = mtest('12341234')
print (a.sendtest())
Vấn đề là rằng nó doesn' Lưu giữ phiên được ủy quyền, vì vậy đây là kết quả đầu ra:
[email protected]:/home/dinocob# python3 test.py
[email protected]
{'error': {'message': 'Please log in.', 'code': 'AuthorizationRequired'}}
Như bạn thấy, cuộc gọi đăng nhập là worki ng ok, nhưng khi gọi và gửi hello
trong hàm sendtest
, phiên không giống nhau.
- Trường hợp nào bị hủy phiên?
- Làm thế nào tôi có thể bảo toàn nó (mà không cần mạnh mẽ sửa đổi cấu trúc lớp học của tôi)?
Bạn đang lưu mã thông báo được ủy quyền của mình khi đăng nhập? – MooingRawr
Vào 'self.api_token' bên trong hàm' __init__'. Nhưng nó hoạt động ok; vấn đề xuất hiện khi gọi hàm '__async_send_recieve' tôi nghĩ ... – harrison4