Django信号+频道:消息没有传到客户端。

问题描述 投票:0回答:1

我希望每次进行.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 没有通过。是什么问题?

python django django-models django-channels django-signals
1个回答
1
投票

你需要添加一个 channel_layerecho_group 当你第一次接受连接时。

    async def websocket_connect(self, event):
        print("connected", event)
        await self.channel_layer.group_add("echo_group",self.channel_name)
        await self.send({
            "type": "websocket.accept"
        })
© www.soinside.com 2019 - 2024. All rights reserved.