0
私はdjango、django rest frameworkとRabbitmqを使用しています。ユーザーがコメントを作成した後(長いポーリングのように)Rabbitmqを使用してクライアントに通知を送信します。 私はここにRabbitMQ Tutorialsに従います。 Rabbitmqで通知を送信
ここでコメントを作成するには、私のview.pyです:私は、キューコール「task_queue」、および送信されたメッセージを作成class CommentList(generics.ListCreateAPIView):
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
queryset = Comment.objects.all()
serializer_class = CommentSerializer
def perform_create(self, serializer):
serializer.save(user=self.request.user)
def create(self, request, *args, **kwargs):
#use pika and rabbitmq to notifity user
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel()
channel.queue_declare(queue='task_queue', durable=True)
message = 'Hello, world'
channel.basic_publish(exchange='',
routing_key='task_queue',
body=message,
properties=pika.BasicProperties(
delivery_mode = 2, # make message persistent
))
connection.close()
return super().create(request, args, kwargs)
の「Hello、world」の私が作成するたびに、私はコメント。私が作成した後、私がメッセージを送信することができる
function poll() {
var poll_interval=0;
$.ajax({
url: "/sub", //sub calls get_notifications()
type: 'GET',
dataType: 'json',
success: function(data) {
append_circle();
poll_interval=0;
},
error: function() {
poll_interval=1000;
},
complete: function() {
setTimeout(poll, poll_interval);
},
});
}
:クライアント側で
def get_notifications(request):
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel()
channel.queue_declare(queue='task_queue', durable=True)
def callback(ch, method, properties, body):
return HttpResponse("ok")
ch.basic_ack(delivery_tag = method.delivery_tag)
#channel.basic_qos(prefetch_count=1)
channel.basic_consume(callback,
queue='task_queue')
channel.start_consuming()
、私はデータを要求するためにjqueryのAJAX機能を使用します。ここでは
は、メッセージを受信するための私のview.pyですコメントはありますが、クライアント側にデータが届かない場合は、クロームコンソールで次のように見つけます:
sub/ (pending) xhr
どうすればいいですか?
これは本当にrabbitmqの目的ではありません。 –
だから私は代わりにdjango-socketioまたはdjangoチャンネルを使うべきですか? – Windsooon