Как повторно использовать область в AsyncWebsocketConsumer, чтобы я мог создать websocketProducer? - PullRequest
0 голосов
/ 08 января 2020

У меня есть два класса, один из которых запускается, когда я получаю веб-крючок, другой - когда я получаю соединение с веб-сокетом

application = ProtocolTypeRouter({
    'websocket': backEndConsumer,
    'http': frontEndConsumer,
    ]),

Сначала я хочу, чтобы мой сервер ожидал соединения с веб-сокетом, чтобы он мог установить sh соединение с моим устройством. Но затем я хочу, чтобы мой webhook передавал данные и инициировал отправку websocket.

в моем frontEndConsumer:

class frontEndConsumer(AsyncHttpConsumer):
    async def http_request(self, request): #request is already a json object
        print(myapp.consumers.scope)
        myapp.consumers.backEndConsumer.websocket_test(myapp.consumers.scope)

        body = request.get('body')       # json object with body that has a bytes inside
        body = json.loads(body.decode()) # decode changes body from byte to string, and changes string to json object
        # make response
        fulfillmentText = "server got command correctly"
        fulfillmentText = {'fulfillmentText': fulfillmentText}
        fulfillmentText = json.dumps(fulfillmentText).encode('utf-8') 

        await self.send_response(200, fulfillmentText, 
            headers=[(b"Content-Type", b"text/plain"),])

в моем backEndConsumer:

scope = None
class backEndConsumer(AsyncJsonWebsocketConsumer):
    groups = ["broadcast"]

    async def websocket_connect(self, type):
        # Called on connection.
        # To accept the connection call:
        await self.accept()
        global scope
        scope = self.scope
    async def websocket_disconnect(self, close_code):
        await self.close()
        # Called when the socket closes
    async def websocket_receive(self, text_data=None, bytes_data=None):
        # Called with either text_data or bytes_data for each frame
        # You can call:
        await self.send("return counter: " + str(myapp.webhook.counter))
    async def websocket_test(self):
        await self.send("Hello world!")

    async def websocket_send(self, text_data=None, bytes_data=None):
        await self.send("command to embedded")

в моем http_request Я хочу использовать websocket_test (), но когда я запускаю его без каких-либо переменных, он говорит мне, что я скучаю по себе. Поэтому я сделал глобальную область видимости и добавил в websocket_test (scope). код выполняется, но я ничего не получаю при подключении к веб-сокету.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...