2016-03-29 5 views
0

Я использую django, django rest framework и 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); 
     }, 
    }); 
} 

Я могу отправить сообщение после того, как я создаю комментарий, но моя клиентская сторона не получает никаких данных, на моей консоли хром я нахожу это:

sub/ (pending) xhr 

Что мне делать?

+0

На самом деле это не тот кролик. –

+0

Так что я должен использовать каналы django-socketio или django? – Windsooon

ответ

4

Для этого типа приложений лучше всего использовать веб-порты. Я предлагаю вам использовать websockets вместо длительного опроса. Потому что длительный опрос - это ресурсный голодный процесс. Чтобы использовать веб-порты, вы можете использовать channels