Перемещение параметра 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