2017-02-06 17 views
5

tôi có mã này tương tác với một api WebSocket sử dụng asyncwebsokets 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)?
+0

Bạn đang lưu mã thông báo được ủy quyền của mình khi đăng nhập? – MooingRawr

+0

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

Trả lời

1

Tôi nghĩ rằng vấn đề này có thể là trong context_manager hoặc withstatement.

async def __async_send_recieve(self, jdata): 
    async with self.aws: 
     await self.aws.send(json.dumps(jdata)) 
     return await self.aws.receive() 

Khi bạn gọi 'với' bối cảnh nên diễn ra như sau (với ngoại lệ xử lý tốt hơn và tất cả những lợi ích của cán bộ quản lý bối cảnh , vì vậy bạn có thể hình dung dòng chảy của __async_send_recieve như:

 self.aws.__aenter__() 
     self.aws.send(data) 
     self.aws.receive() 
     self.aws.__aexit__() 

Để chứng minh lý thuyết này, thêm một tuyên bố in vào __aenter____aexit__ vui vẻ ctions và bạn sẽ có thể trực quan hóa tốt hơn luồng quản lý ngữ cảnh.

Việc khắc phục sẽ được ủy quyền lại trong mọi yêu cầu. Nhưng tôi tưởng tượng những gì bạn muốn làm là có lớp thử nghiệm của bạn để quản lý ngữ cảnh được sử dụng để giao tiếp với máy chủ từ xa. (cú pháp không đồng bộ của tôi có thể hơi sai ở đây, nhưng khái niệm với người quản lý ngữ cảnh):

class Mtest(): 
    def __init__(self, ...): 
      ... 

    def __enter__(self,): 
     self.authorize() 

    def __exit__(self): 
     self.deauthorize() 

    async def make_async_request(self, data): 
     await self.aws.send(json.dumps(data)) 
     return await self.aws.receive() 

with Mtest(api_key) as m: 
    m.make_async_request({'test_data': 'dummy_test_data'}) 
    m.make_async_request({'more_data': 'more_mock_data'}) 
0

Từ mã của bạn, có vẻ như máy chủ nhớ trạng thái đăng nhập cho mỗi kết nối websocket, vì vậy bạn không cần phải làm bất kỳ điều gì ở phía máy khách.

Trường hợp nào bị hủy phiên?

Phiên bị hủy ở phía máy chủ.

Tôi làm cách nào để bảo quản?

Khắc phục lỗi máy chủ?

Các vấn đề liên quan