【问题标题】:Django Channels. Adding users to a GroupDjango 频道。将用户添加到组
【发布时间】:2017-10-25 18:40:12
【问题描述】:

我正在编写一种社交网络应用程序。我想让用户创建对话并在创建对话时将他们的朋友添加到对话中。他们将通过 websocket 接收消息。

我遇到的问题是,我可以在建立 websocket 连接时添加用户来收听他们的对话,但是如何将用户的 reply_channel 添加到由其他一些用户对话新创建的 Group 中(而以前的用户已经建立了 websocket 连接),以便他们可以开始收听来自对话的传入消息?

这是我在conversations 应用程序中的consumers.py

from channels import Channel, Group
from channels.sessions import channel_session, enforce_ordering
from channels.auth import channel_session_user, channel_session_user_from_http
from channels.security.websockets import allowed_hosts_only


@allowed_hosts_only
@channel_session_user_from_http
def ws_connect(message):
    user = message.user
    conversation_ids = list(user.conversations.all().values('id'))
    groups = ['_'.join(['conversation', id]) for id in conversation_ids]
    for group in groups:
        Group(group).add(message.reply_channel)
    message.reply_channel.send({"accept": True})

@channel_session_user
def ws_receive(message):
    pass

@channel_session_user
def ws_disconnect(message):
    user = message.user
    conversation_ids = list(user.conversations.all().values('id'))
    groups = ['_'.join(['conversations', id]) for id in conversation_ids]
    for group in groups:
        Group(group).discard(message.reply_channel)
    message.reply_channel.send({"accept": True})

我打算通过 http 请求提交消息。这些是我的views.pyconversations 应用程序的相关豁免(这是不呈现任何html 的API 视图)。

class MessageView(APIView):
    permission_classes = (IsAuthenticated,)

    @method_decorator(never_cache)
    def put(self, request):
        user = request.user.id
        conversation_id = request.data.get("conversation_id")
        conversation = get_object_or_404(Conversation, id=conversation_id)
        message_params = {
            request.get('message')
        }
        serializer = MessageSerializer(data=message_params)
        if serializer.is_valid():
            serializer.save()
            return Response(status=status.HTTP_200_OK)
        else:
            return Response(status=status.HTTP_400_BAD_REQUEST)

class ConversationView(APIView):
    permission_classes = (IsAuthenticated,)

    @method_decorator(never_cache)
    def put(self, request):
        creator = get_object_or_404(Person, id=request.user.id)
        participants = []
        for participant in request.data.get("participants"):
            participants.append(get_object_or_404(Person, id=participant))
        conversation = create_conversation(creator, *participants)
        serializer = ConversationSerializer(conversation)
        return Response(serializer.data, status=status.HTTP_200_OK)

我想我会在ConversationView 中添加一些代码,以“订阅”参与者的对话更新,比如两行:

for participant in participant:
    Group('conversation_'+conversation.id).add(participant_reply_channel)

就在return 之前。但是,我不知道如何获取 participant_reply_channel 的值。

【问题讨论】:

  • 您需要添加一些代码,以便我们至少可以尝试提供帮助。根据经验,您可以越具体,收到的响应就越好。

标签: django django-channels


【解决方案1】:

我最近也在为同样的问题而苦苦挣扎。使用django-channels-presence 解决了我的问题。用户被添加到具有单独组的房间。您要做的是将用户添加到同一个房间,并使用由 daphne 生成的原始回复通道(因此每个用户都是唯一的)将解决您的问题。

【讨论】:

  • 谢谢!这正是我所需要的,尽管我最终使用普通的 redis 库实现了类似的功能。我希望您早点回答,但仍然非常感谢!
  • @Mihail Borisov 你能告诉我你是如何用普通的redis完成这个的吗?我对类似的解决方案感兴趣,也许我可以在 redis 中查询可以“连接”到同一自定义组的用户。提前致谢。马可
猜你喜欢
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
  • 1970-01-01
  • 2011-09-11
  • 2015-06-30
  • 1970-01-01
  • 2021-04-08
相关资源
最近更新 更多