我有一个名为deposit
的模型,并且尝试在表中添加新行时发送实时通知。可以使用django-channels这样做吗?
答案 0 :(得分:0)
您可以简单地为post_save
添加信号
@receiver(post_save, sender=Deposit)
def signal_deposit_save(sender, instance, created, **kwargs):
if created: # This means it is a new row
# Send notification using django-channels
答案 1 :(得分:0)
是的,这就是我最近使用的方式。 您可以使用Django模型的save方法,如下所示:
from channels.generic.websocket import AsyncWebsocketConsumer
class DataConsumer(AsyncWebsocketConsumer):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.group_name = ''
async def connect(self):
# we are using one fixed group
self.group_name = 'infochannel'
await self.channel_layer.group_add(
self.group_name,
self.channel_name
)
await self.accept()
async def disconnect(self, close_code):
await self.channel_layer.group_discard('infochannel', self.channel_name)
async def infochannel_message(self, event):
# Send message to websocket group
await self.send(text_data=event['device_id'])
在消费者中:
device_id
const YTDL = require('ytdl-core')
function play(connection, message)
{
var server = servers[message.guild.id]
server.dispatcher = connection.playStream(YTDL(server.queue[0], {filter: "audioonly"}))
server.dispatcher.on("end", function() {
if(server.queue[0])
{
play(connection, message)
const args = server.queue[0]
YTDL.getInfo(args, function(err, info) {
const title = info.title
message.channel.send(`:musical_note: **${title}** is now playing!`)
})
server.queue.shift()
}
else
{
connection.disconnect()
message.channel.send(":warning: There are no more songs in the queue!")
}
})
}
class playCommand extends commando.Command
{
constructor(client)
{
super(client, {
name: 'play',
group: 'simple',
memberName: 'play',
description: 'idfl'
})
}
async run(message, args)
{
if(!args[0])
{
message.channel.send("Please provide a link")
return;
}
if(!message.member.voiceChannel)
{
message.channel.send("You must be in a voice channel")
return;
}
if (message.content.includes("http://") || message.content.includes("https://")) {
if (message.content.includes("youtube") || message.content.includes("youtu.be")) {
if(!servers[message.guild.id]) servers[message.guild.id] = {queue: []}
var server = servers[message.guild.id]
server.queue.push(args)
if(!message.guild.voiceConnection) message.member.voiceChannel.join().then(function(connection) {
play(connection, message)
const args = message.content.split(" ").slice(1);
YTDL.getInfo(args.join(" "), function(err, info) {
const title = info.title
message.channel.send(`:musical_note: **${title}** is now playing!`)
})
server.queue.shift()
})
}
else
{
message.reply("Only youtube links!")
}
}
else
{
message.reply("Only youtube links!")
}
}
}
module.exports = playCommand;
是我的模型中的一个字段,当然,您还必须设置路由,redis_channels等。