Получите доступ к данным, полученным через API, к пользователю через ViewSocket (Django-Channelsv2.2 & DRF). - PullRequest
0 голосов
/ 22 июня 2019

Я пытался найти способ отправить данные в Consumer (Django Channels v.2.2) из ​​View (APIView Django-rest-framework) или распределенной задачи (напрямую Celery / RabbitMQ)

I 'Буду очень признателен за любой пример кода, который позволит мне получить доступ к потребителю из View, поскольку сам триггер - это устройство ввода, а не веб, поэтому я могу выполнять вызов API из него, поэтому мне нужен соединитель.

Каналы Django v.2.2, DjangoChannelsRestFramework, в основном все описанные здесь случаи: https://channels.readthedocs.io/en/latest/community.html, а также коррелирующие вопросы @ stackoverflow

consumer.py

class BasicConsumer(AsyncConsumer):
    async def websocket_connect(self, event):
        print('connected', event)
        await self.send({
            "type": "websocket.accept"
        })
        # await self.send({
        #     "type": "websocket.send",
        #     "text": "Hello world"
        # })

    async def websocket_receive(self, event):
        print('receive', event)
        front_text = event.get('text', None)
        if front_text is not None:
            loaded_dict_data = json.loads(front_text)
            msg = loaded_dict_data.get('message')
            print(msg)
            user = self.scope['user']

            if user.is_authenticated:
                username = user.username
            myResponse = {
                'message': msg,
                'username': username
            }
            await self.send({
                "type": "websocket.send",
                "text": json.dumps(myResponse)
            })

    async def websocket_disconnect(self, event):
        print('disconnect', event)

    @database_sync_to_async
    def get_thread(self, user, other_username):
        return Thread.objects.get_or_new(user, other_username)[0]

views.py

class BasicView(APIView):
    def post(self, request):
        serializer = BasicViewSerializer(data=request.data)
        if serializer.is_valid():
           triggerConsumer(serializer.validated_data)

1 Ответ

1 голос
/ 23 июня 2019

Я думаю, что было бы лучше определить название канала и отправить на него данные.

from asgiref.sync import async_to_sync
async_to_sync(channel_layer.send)("channel_name", {...})

полный текст документа вы можете увидеть здесь документ

...