【问题标题】:Django sending data from outside consumer classDjango从外部消费者类发送数据
【发布时间】:2022-08-09 12:38:03
【问题描述】:

我正在尝试使用 Django 通道通过 websocket 将数据从 django 发送到我的 react 本机应用程序。我已经阅读了 Django 上有关此主题的所有可用文档,并浏览了许多 stackoverflow 帖子,但我认为它们不适用于我,因为它们使用 redis,而我决定不使用 redis。

每当我现在尝试发送数据时,什么都没有发送。

这些是我的文件。

模型.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\'

设置.py

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

消费者.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\")

我想要做的是每当一个新值存储在我的数据库中时,我都会尝试通过连接我的反应本机应用程序和我的 django 后端的 websocket 发送消息。 websocket 目前连接良好,但我在使用来自外部 consumer.py 的 consumer.py 文件中包含的 send_message 函数时遇到问题。所以我要做的是在我的 models.py 文件中,向所有打开的通道发送一条消息,以最终更新我的数据库。目前,我只是想通过发送测试消息,但无论我做什么,都没有通过,作为 Django 的新手,我不知道为什么。

谢谢!

    标签: django websocket django-channels


    【解决方案1】:

    在朋友的帮助下解决了!

    消费者.py

    import json
    from channels.generic.websocket import AsyncJsonWebsocketConsumer
    from .models import Client
    from asgiref.sync import sync_to_async
    
    #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):
            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")
    

    模型.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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 2018-08-20
      • 2020-05-13
      • 1970-01-01
      • 2021-06-12
      相关资源
      最近更新 更多