Я пытался найти способ отправить данные в 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)