2017-02-06 9 views
5

У меня есть этот код, чтобы взаимодействовать с WebSocket API с помощью async и websokets питона библиотеки:Как сохранить сеанс при использовании асинхронных веб-узлов?

#!/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() 

Так у меня есть следующие в main.py:

from webclass import * 

a = mtest('12341234') 
print (a.sendtest()) 

Проблема заключается в том, что она Безразлично» t сохранить авторизованный сеанс, так что это выходной сигнал:

[email protected]:/home/dinocob# python3 test.py 
[email protected] 
{'error': {'message': 'Please log in.', 'code': 'AuthorizationRequired'}} 

Как вы видите, логин-логин является рабочим ng ok, но при вызове и отправке hello в функции sendtest сеанс не совпадает.

  • Где разрушается сессия?
  • Как я могу его сохранить (без существенного изменения ).
+0

Где вы сохраняете свой авторизованный токен после входа в систему? – MooingRawr

+0

В 'self.api_token' внутри' __init__'. Но он работает нормально; проблема возникает при вызове функции '__async_send_recieve', я думаю ... – harrison4

ответ

1

Я думаю, что этот вопрос может быть в context_manager или withstatement.

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

При вызове «с» контекст должен играть следующим образом (с лучшей обработкой исключений и все преимущества менеджеров контекста , так что вы можете представить себе поток __async_send_recieve как:

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

Чтобы доказать эту теорию, добавьте оператор печати в __aenter__ и __aexit__ удовольствия и вы должны иметь возможность лучше визуализировать поток диспетчера контекста.

Исправление будет заключаться в повторной авторизации в каждом запросе. Но я предполагаю, что вы хотите, чтобы ваш тестовый класс управлял контекстом, используемым для связи с удаленным сервером. (мой асинхронный синтаксис может быть немного неправильным здесь, но концептуально с менеджерами контекста):

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

Из вашего кода, кажется, сервер запоминает статус входа для каждого подключения к веб-соединению, поэтому вам не нужно ничего делать на стороне клиента.

Где разрушена сессия?

Сессия уничтожается на стороне сервера.

Как я могу его сохранить?

Исправить ошибку сервера?