2016-03-29 2 views
0

J'utilise django, django rest framework et Rabbitmq, Ce que je veux, c'est utiliser Rabbitmq pour envoyer des notifications au client après avoir créé un commentaire (comme une longue interrogation). Je suis le RabbitMQ Tutorials ici.Envoyer des notifications avec Rabbitmq

Voici mon view.py pour créer des commentaires:

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) 

Je crée un appel de file d'attente « task_queue », et le message envoyé « Bonjour, monde » à chaque fois que je crée je commente.

Voici mon view.py recevoir un message:

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() 

En côté client, j'utilise une fonction ajax jquery pour demander des données:

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

je peux envoyer le message après avoir créé le commentaire, mais mon côté client ne reçoit aucune donnée, dans ma console chromée, je trouve ceci:

sub/ (pending) xhr 

Que dois-je faire?

+0

Ce n'est pas vraiment ce que rabbitmq est pour. –

+0

Donc, je devrais utiliser les canaux django-socketio ou django à la place? – Windsooon

Répondre

4

Pour ce type d'application, les Websockets sont la meilleure option. Je vous suggère d'utiliser des websockets au lieu de longues interrogations. Parce que le long sondage est un processus gourmand en ressources. Pour utiliser les Websockets, vous pouvez utiliser channels