django-channels:区分不同的`AnonymousUser`

时间:2018-07-05 09:04:13

标签: django django-channels

不幸的是,我正在使用django-channels频道1.1.8,因为我错过了所有 更新了频道2.0。正如我们刚才所述,现在升级是不现实的 启动,这需要一些时间才能正确找出。

这是我的问题:

我正在使用* message.user.id *区分经过身份验证的 我需要向其发送消息的用户。但是,在某些情况下 还需要向未经身份验证的用户发送邮件-该邮件 取决于外部API调用。我已经在 ws_connect()中完成了此操作:

@channel_session_user_from_http
def ws_connect(message):
    # create group for user
    if str(message.user) == "AnonymousUser":
        user_group = "AnonymousUser" + str(uuid.uuid4())
    else:
        user_group = str(message.user.id)


    print(f"user group is {user_group}")
    Group(user_group).add(message.reply_channel)
    Group(user_group).send({"accept": True})
    message.channel_session['get_user'] = user_group

这只是问题的第一部分,基本上我是在随机添加一个 每个AnonymousUser实例的字符串。但我找不到访问方法 来自视图中请求对象的字符串,以确定 我正在发送消息

这甚至可以实现吗?目前,我无法访问设置在其中的任何内容 我认为 ws_connect

编辑:按照kagronick的建议,我尝试了以下方法:

@channel_session_user_from_http
def ws_connect(message):
    # create group for user

    if str(message.user) == "AnonymousUser":
        user_group = "AnonymousUser" + str(uuid.uuid4())
    else:
        user_group = str(message.user.id)

    Group(user_group).add(message.reply_channel)
    Group(user_group).send({"accept": True})
    message.channel_session['get_user'] = user_group
    message.http_session['get_user'] = user_group
    print(message.http_session['get_user'])
    message.http_session.save()

但是,当用户为http_session时,NoneAnonymousUser。其他装饰者没有帮助。

2 个答案:

答案 0 :(得分:0)

是的,您可以保存到会话并在视图中访问它。但是您需要使用http_session而不是channel会话。使用@http_session装饰器或@channel_and_http_session。您可能需要调用message.http_session.save()(我不记得了,我现在在第2频道上。)。但是之后,您将能够在视图中看到用户的组。

此外,为此使用小组是一种过大的杀伤力。如果该组只有1个用户,则将reply_channel放入会话中,并在视图中执行类似Channel(request.session['reply_channel']).send()的操作。这样,无需查找组中的一个用户即可直接发送给该用户。

如果这可以解决您的问题,请将其标记为已接受。

答案 1 :(得分:0)

编辑:不幸的是,这仅在本地有效,而在生产中无效。当AnonymousUser时,message.http_sesssion不存在。

用户kagronick使我步入正轨,他指出message具有http_session属性。但是,当用户为AnonymousUser时,http_sessionNone始终是ws_connect,这违反了我们的目的。

我已经通过检查用户在视图中是否为匿名 来解决此问题,如果是,则表示他没有会话(或者至少渠道看不到该会话) ),初始化一个,然后为键get_user分配值"AnonymousUser" + str(uuid.uuid4())(以前是在使用者中使用的方法)。

完成此操作后,每次ws_connect都被称为message时,将具有一个http_session属性:登录时的用户ID或AnonymousUser-uuid.uuid4()。 / p>