我希望每次进行.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
没有通过。是什么问题?
你需要添加一个 channel_layer
至 echo_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"
})