Django signals + channels:消息没有传递给客户端

Django signals + channels: message not going through to client

我希望每次执行 .save() 时都发送一个信号

from django.db import models
from django.forms.models import model_to_dict
from django.db.models.signals import post_save
from channels.layers import get_channel_layer
from django.core.serializers.json import DjangoJSONEncoder
from asgiref.sync import async_to_sync
import json

class DeribitFundingData(models.Model):
    time = models.DateTimeField()
    rate = models.FloatField()

    def __str__(self):
        return str(self.time)

def save_post(sender, instance, **kwargs):
    channel_layer = get_channel_layer()
    data = model_to_dict(instance)
    json_data = json.dumps(data, cls=DjangoJSONEncoder)
    async_to_sync(channel_layer.group_send)(
        "echo_group",
        {"type": "stream", "data": json_data},
    )

post_save.connect(save_post, sender=DeribitFundingData)

我的消费者看起来如下,其中 stream 应该从 save_post 接收数据:

class StreamConsumer(AsyncConsumer):

    groups = ["echo_group"]

    async def websocket_connect(self, event):
        print("connected", event)
        await self.send({
            "type": "websocket.accept"
        })

    async def stream(self, event):
        data = event["message"]

        await self.send({
           'type': 'websocket.send',
           'text': data
        })

我的.js:

<script>
    var loc = window.location
    var wsStart = "ws://"
    if (loc.protocol == 'https:'){
        wsStart = 'wss://'
    }
    var endpoint = wsStart + loc.host + "/websockets/"
    console.log(endpoint)

    socket = new WebSocket(endpoint);

    socket.onopen = function(message) {
        console.log("open", message);
      }

    socket.onmessage = function(message) {
        console.log("message", message);
    }

    socket.onerror = function(message) {
        console.log("error", message);
    }

    socket.onclose = function(message) {
        console.log("close", message);
    }
</script>

在 shell 我看到 websockets 连接已建立。虽然我从 post_save 发送的消息没有通过。怎么了?

首次接受连接时需要在echo_group中添加channel_layer:

    async def websocket_connect(self, event):
        print("connected", event)
        <b>await self.channel_layer.group_add("echo_group",self.channel_name)</b>
        await self.send({
            "type": "websocket.accept"
        })