2016-03-29 12 views
0

Ich benutze Django, Django Rest Framework und Rabbitmq, Was ich will ist mit Rabbitmq Benachrichtigungen an den Client senden, nachdem Benutzer einen Kommentar erstellen (wie lange Polling). Ich folge dem RabbitMQ Tutorials hier.Senden Sie Benachrichtigungen mit Rabbitmq

Hier meine view.py ist Kommentare zu erstellen:

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) 

ich eine Warteschlange Anruf „task_queue“, und gesendete Nachricht erstellen „Hallo, Welt“ jedes Mal, wenn ich schaffe ich kommentieren.

Hier ist meine view.py Nachricht zu erhalten:

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

In Client-Seite, verwende ich eine jQuery Ajax-Funktion Daten anfordern:

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

ich die Nachricht senden kann, nachdem ich erstellen der Kommentar, aber meine Client-Seite erhält keine Daten, in meiner Chrom-Konsole, finde ich das:

Was soll ich tun?

+0

Das ist nicht wirklich was Kaninchenmq ist. –

+0

Also sollte ich stattdessen django-socketio oder django-Kanäle verwenden? – Windsooon

Antwort

4

Für diese Art von Anwendung sind Websockets die bessere Option. Ich schlage vor, dass Sie WebSockets statt langer Abfragen verwenden. Weil langes Polling ein ressourcenhungriger Prozess ist. Um websockets zu verwenden, können Sie channels

verwenden
Verwandte Themen