Django отправляет данные из внешнего класса потребителя

Я пытаюсь получить использование каналов Django для отправки данных через веб-сокет в мое react native приложение из django. Я прочитал всю доступную документацию по этому вопросу на Django и просмотрел множество постов на stackoverflow, но я не думаю, что они применимы ко мне, потому что они используют redis, а я решил не использовать redis.

Когда я пытаюсь отправить данные прямо сейчас, ничего не отправляется.

Это мои файлы.

models.py

from django.db import models
import json
from .consumers import DBUpdateConsumer
from django.db.models.signals import post_save
from django.dispatch import receiver
from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync



channel_layer = get_channel_layer()


class Connect(models.Model):
    id = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')
    neighborhood = models.CharField(max_length=50, choices=neighborhood_choices, default='all')
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.CharField(max_length=100)
    phone = models.CharField(max_length=50)

    def save(self, *args, **kwargs):
        super().save(self, *args, **kwargs)
        print("def save")
        async_to_sync(channel_layer.send)("hello", {"type": "something", "text": "hellooo"})


    class Meta:
        managed = False
        db_table = 'connect'

settings.py

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels.layers.InMemoryChannelLayer"
    }
}

consumers.py

import json
from channels.generic.websocket import AsyncJsonWebsocketConsumer


#used https://blog.logrocket.com/django-channels-and-websockets/
#https://channels.readthedocs.io/en/latest/topics/consumers.html

class DBUpdateConsumer(AsyncJsonWebsocketConsumer):
    async def connect(self):
        self.send_message(self, "UPDATE")

        
        await self.accept()

        await self.send(text_data=json.dumps({
            "payload": "UPDATE",
        }))
        print("connect!")

    async def disconnect(self, close_code):
        print("Disconnected")
        

    async def receive(self, text_data):
        """
        Receive message from WebSocket.
        Get the event and send the appropriate event
        """
        response = json.loads(text_data)
        #event = response.get("event", None)
        #message = response.get("message", None)

        print(response)
       

    @classmethod
    async def send_message(cls, self, res):
        # Send message to WebSocket
        print("send msg")
        await self.send(text_data=json.dumps({
            "payload": res,
        }))
        print("send msg")

Я пытаюсь сделать так: каждый раз, когда новое значение хранится в моей базе данных, я пытаюсь отправить сообщение через вебсокет, который соединяет мое приложение react native и мой бэкенд django. Вебсокет в настоящее время подключается нормально, но у меня возникают проблемы с использованием функции send_message, содержащейся в моем файле consumers.py, извне consumers.py. Итак, я пытаюсь в файле models.py отправить сообщение всем каналам, которые открыты, чтобы в конечном итоге обновить мою базу данных. В настоящее время я просто пытаюсь отправить тестовые сообщения, но что бы я ни делал, ничего не проходит, и будучи новичком в Django, я понятия не имею почему.

Спасибо!

Решено, с некоторой помощью друга!

consumers.py

`импорт json from channels.generic.websocket import AsyncJsonWebsocketConsumer из .models import Client from asgiref.sync import sync_to_async

#использовано https://blog.logrocket.com/django-channels-and-websockets/ #https://channels.readthedocs.io/en/latest/topics/consumers.html

class DBUpdateConsumer(AsyncJsonWebsocketConsumer): async def connect(self): print("channel name is " + self.channel_name) await sync_to_async(Client.objects.create)(channel_name=self.channel_name) await self.accept() await self.send(text_data=json.dumps({ "payload": "UPDATE", })) print("connect!")

async def disconnect(self, close_code):
    print("Disconnected")
    # Leave room group
    """await self.channel_layer.group_discard(
        self.room_group_name,
        self.channel_name
    )"""

async def update(self, message):
    print("Sent message " + message["text"])
    await self.send(text_data=json.dumps({
        "payload": "UPDATE",
    }))

async def receive(self, text_data):
    """
    Receive message from WebSocket.
    Get the event and send the appropriate event
    """
    response = json.loads(text_data)
    #event = response.get("event", None)
    #message = response.get("message", None)

    print(response)
    """if event == 'MOVE':
        # Send message to room group
        await self.channel_layer.group_send(self.room_group_name, {
            'type': 'send_message',
            'message': message,
            "event": "MOVE"
        })

    if event == 'START':
        # Send message to room group
        await self.channel_layer.group_send(self.room_group_name, {
            'type': 'send_message',
            'message': message,
            'event': "START"
        })

    if event == 'END':
        # Send message to room group
        await self.channel_layer.group_send(self.room_group_name, {
            'type': 'send_message',
            'message': message,
            'event': "END"
        })"""

# @classmethod
# async def send_message(cls, self, res):
#     # Send message to WebSocket
#     print("send msg")
#     await self.send(text_data=json.dumps({
#         "payload": res,
#     }))
#     print("send msg")`

models.py

class Connect(models.Model):
id = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')
neighborhood = models.CharField(max_length=50, choices=neighborhood_choices, default='all')
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
email = models.CharField(max_length=100)
phone = models.CharField(max_length=50)

def save(self, *args, **kwargs):
    super().save(self, *args, **kwargs)
    clients = Client.objects.all()
    for client in clients:
        async_to_sync(channel_layer.send)(client.channel_name, {"type": "update", "text": "hellooo"})

class Meta:
    managed = False
    db_table = 'connect'
Вернуться на верх