2016-03-29 30 views
0

我正在使用django,Django rest框架和Rabbitmq,我想要的是在用户创建评论(如长轮询)后使用Rabbitmq向客户端发送通知。 我在此处关注RabbitMQ Tutorials发送有关Rabbitmq的通知

这是我view.py创建评论:

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) 

我创建队列调用“task_queue”,并发送消息“你好,世界”每次我创建时间我的评论。

这是我view.py收到消息:

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函数来请求数据:

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); 
     }, 
    }); 
} 

创建后,我可以将消息发送评论,但我的客户端没有收到任何数据,在我的Chrome控制台,我发现这个:

sub/ (pending) xhr 

我该怎么做?

+0

这实际上并不是rabbitmq的用途。 –

+0

因此,我应该使用django-socketio或django频道吗? – Windsooon

回答

4

对于这种类型的应用程序,websockets是更好的选择。我建议你使用websockets而不是长轮询。因为长时间轮询是资源饥饿的过程。要使用websockets,您可以使用channels