использование каналов django для отправки данных извне класса потребителя не работает - PullRequest
0 голосов
/ 16 октября 2019

Мой потребитель выглядит следующим образом:

class pretask(AsyncWebsocketConsumer):

    async def connect(self):
        self.group_name = "group_test_01"
        await self.channel_layer.group_add(
            self.group_name,
            self.channel_name
        )
        await self.accept()

    async def receive(self, text_data):
        message = json.loads(text_data)
        await self.channel_layer.group_send(
            self.group_name,
            {
                'type': 'show_in_windows',
                'message': message
            }
        )
    async def show_in_windows(self,event):
        print("7")
        message = event["message"]
        print(message)
        await self.send(text_data=json.dumps({
            "message":message}))
    async def disconnect(self, close_code):
        pass

Когда я использую клиент для запроса websocket, журнал сервера выглядит следующим образом: он работал нормально。

INFO WebSocket HANDSHAKING /ws/skworkorders/WorkOrderCommit/pretask/ [127.0.0.1:57566]
INFO WebSocket CONNECT /ws/skworkorders/WorkOrderCommit/pretask/ [127.0.0.1:57566]
7
{'csrfmiddlewaretoken': 'YhfDhjZxtPsRqSN8Mo0Nhybt8JY3KLyNWeQ84VBc6F0u8ff4F7npRI1hriSRMRiT', 'title': 'AnsibleCMD-DEV',......}

Но когдаЯ изменил своего потребителя следующим образом: функция web_send не работала

class pretask(AsyncWebsocketConsumer):


    async def connect(self):
        self.group_name = "group_test_01"
        await self.channel_layer.group_add(
            self.group_name,
            self.channel_name
        )
        await self.accept()

    async def receive(self, text_data):
        p1 = TestWebSend(self.group_name,"call out")
        p1.sendmsg()
        print(text_data)

    async def show_in_windows(self,event):
        print("7")
        message = event["message"]
        print(message)
        await self.send(text_data=json.dumps({
            "message":message}))
    async def disconnect(self, close_code):
        pass

, класс TestWebSend выглядит следующим образом:

    from channels.layers import get_channel_layer
    from asgiref.sync import async_to_sync

    def web_send(group_name,msg):
        print("4")
        channel_layer = get_channel_layer()
        print("5")
        print(group_name)

        async_to_sync(channel_layer.group_send)(group_name,
            {
                'type': 'show_in_windows',
                'message': msg
            }
        )
        print("6")

    class TestWebSend():
        def __init__(self,group_name,msg):
            self.msg = msg
            print(self.msg)
            self.group_name = group_name
            print(self.group_name)

        def sendmsg(self):
            print("3")
            web_send(self.group_name, self.msg)
            print("8")

Когда я использую клиент для запроса веб-сокета, сервержурнал выглядит следующим образом: async_to_sync (channel_layer.group_send) не работает:

INFO WebSocket HANDSHAKING /ws/skworkorders/WorkOrderCommit/pretask/ [127.0.0.1:58251]
INFO WebSocket CONNECT /ws/skworkorders/WorkOrderCommit/pretask/ [127.0.0.1:58251]
call out
group_test_01
3
4
5
group_test_01
INFO WebSocket DISCONNECT /ws/skworkorders/WorkOrderCommit/pretask/ [127.0.0.1:58251]
...