2016-09-04 7 views
8

Я пробовал django-channels, включая чтение документов и воспроизведение с примерами.Отправка сообщения одному пользователю с использованием django-каналов

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

Мой прецедент создает новое уведомление (через задачу сельдерея) и после того, как уведомление сохранено, отправив это уведомление одному пользователю.

Это звучит, как это возможно (от django-channels docs)

... основная часть является то, что вы можете запустить код (и так отправить на каналов) в ответ на любое событие - и включает в себя вас создать. Вы можете запускать на моделях сохранение, другие входящие сообщения или из кодовых путей внутри представлений и форм.

Однако, читая документы дальше и играя с django-channels examples, я не вижу, как я могу это сделать. Примеры привязки данных и liveblog демонстрируют отправку в группу, но я не вижу, как просто отправлять одному пользователю.

Любые предложения были бы очень признательны.

ответ

10

Развивая ответ @ Флип создания группы для конкретного пользователя.

В функции питона в вашей функции ws_connect вы можете добавить этого пользователя в группу аа только для них:

consumers.py

from channels.auth import channel_session_user_from_http, 
from channels import Group 

@channel_session_user_from_http 
def ws_connect(message): 
    Group("%s" % <user>).add(message.reply_channel) 

Чтобы отправить этому пользователю сообщение из кода питона :

мой view.py

import json 
from channels import Group 

def foo(user): 
    Group("%s" % <user>).send({ 
     "text": json.dumps({ 
      "foo": 'bar' 
     }) 
    }) 

Если они подключены, они получат сообщение. Если пользователь не подключен к веб-узлу, он будет терпеть неудачу.

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

Обратите внимание на примеры каналов django, в частности multichat, для того, как реализовать маршрутизацию, создать соединение с веб-сервером на стороне клиента и настроить django_channels.

Удостоверьтесь, что вы также посмотрите на django channels docs.

+1

Это намеченный способ сделать это или просто обходным путем. – Shubham

+0

Я не вижу никакого способа сделать это за пределами потребителя без группы. Вы должны быть внутри потребителя, чтобы получить message.reply_chanel. Вне потребителя вы должны создать группу для доступа к пользователю. Ознакомьтесь с соответствующими документами здесь: https://channels.readthedocs.io/en/stable/concepts.html#channel-types. Также ознакомьтесь с примерами Multichat и Livebloe, представленными здесь: https://github.com/andrewgodwin/channels-examples –

+0

имел тот же вопрос. создание группы для этого на самом деле не является ее намерением, я думаю, у нас нет другого варианта. –

2

Лучшим подходом является создание группы для этого конкретного пользователя. Когда ws_connect вы можете добавить этого пользователя в Group("%s" % <user>).add(message.reply_channel)

Примечание: Мой WebSocket Ссылка ws://127.0.0.1:8000/<user>

+0

Спасибо за это. Так вы говорите, чтобы сделать одну группу для каждого пользователя в моем случае использования? –

+0

@ luke_aus да ... это будет работать в большинстве случаев ... –

+0

спасибо. любая идея, насколько это будет масштабироваться? –

0

Просто расширить ответ @ luke_aus, в случае работы с ResourceBindings, вы также можете сделать так, что только пользователи «владеющим» объект получения обновлений для них:

Как @luke_aus ответ мы регистрируем пользователю его собственной группе, где мы можем опубликовать действия (update, create) и т.д., которые должны быть видимы только для этого пользователя:

from channels.auth import channel_session_user_from_http, 
from channels import Group 

@channel_session_user_from_http 
def ws_connect(message): 
    Group("user-%s" % message.user).add(message.reply_channel) 

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

class SomeUserOwnedObject(models.Model): 
    owner = models.ForeignKey(User) 

Теперь мы можем связать эту модель к нашей группе пользователей и все действия (обновление, создание и т.д.) будут опубликованы только для этого одного пользователя:

class SomeUserOwnedObjectBinding(ResourceBinding): 
    # your binding might look like this: 
    model = SomeUserOwnedObject 
    stream = 'someuserownedobject' 
    serializer_class = SomeUserOwnedObjectSerializer 
    queryset = SomeUserOwnedObject.objects.all() 

    # here's the magic to only publish to this user's group 
    @classmethod 
    def group_names(cls, instance, action): 
     # note that this will also override all other model bindings 
     # like `someuserownedobject-update` `someuserownedobject-create` etc 
     return ['user-%s' % instance.owner.pk] 

 Смежные вопросы

  • Нет связанных вопросов^_^