Перемещение параметра id объекта в consumers.py Django-Channels

У меня возникла проблема. Дело в том, что я делаю приложение с бэкендом Django и фронтендом React. Я хотел сделать вебсокет, который позволяет писать в чаты. Проблема в том, что я понятия не имею, как загрузить динамический идентификатор комнаты. Попробую объяснить. Суть в том, что метод connect из класса ChatConsumer будет загружать сообщения, относящиеся к комнате и отправлять их в виде json на фронтенд.

Вот как это выглядит.

class ChatConsumer(WebsocketConsumer):

    def connect(self):
        self.room_group_name = 'test'

        async_to_sync(self.channel_layer.group_add)(
          self.room_group_name,
          self.channel_name
        )
        messages = Message.objects.filter(room=[HERE I NEED TO PUT ID OF ROOM])
        data_ready_for_json =list( messages.values('room','body','user'))
        self.accept()
        self.send(text_data=json.dumps({
        'type':'chat',
        'message': data_ready_for_json

      }))

Я пытаюсь отправить этот id из моего представления, где у меня есть RoomRetrieveView, созданный generics.RetrieveAPIView. Вот оно:

class RoomRetrieveView(generics.RetrieveAPIView):
    queryset = Room.objects.all()
    permission_classes = (AllowAny,)
    serializer_class = RoomSerializer


    def get_serializer_context(self):
        context = super(RoomRetrieveView,self).get_serializer_context()
        context.update({'id' : self.get_object().id})
        roomId = context['id']
        return roomId

Я пытался переместить эту переменную roomId из get_serializer_context в мой файл consumers.py, но он хочет, чтобы я поставил атрибут "self", но я понятия не имею, как это сделать. Я также пытался использовать метод get_object, но он тоже не работает. У меня нет идей. Я также пытался использовать global, чтобы сделать переменную глобальной из метода, но он все еще не работает. Когда я пытаюсь импортировать что-либо из файла views.py и что-то сделать, я получаю

 File "E:\Coding\Python\PORTFOLIO\Say-It-Social\venv\lib\site-packages\channels\routing.py", line 30, in get_default_application
    raise ImproperlyConfigured("Cannot import ASGI_APPLICATION module %r" % path)
django.core.exceptions.ImproperlyConfigured: Cannot import ASGI_APPLICATION module 'sayitsocial.asgi'

Вы можете использовать id комнаты в URL и получить его с помощью: self.room_name = self.scope['url_route']['kwargs']['id'] также избегайте использования блокирующего кода в потребителях, используйте асинхронные вызовы ORM, записывая запрос в отдельный метод, и используйте database_sync_to_async в качестве декоратора, который можно импортировать из channels.db

Вернуться на верх