不幸的是,我正在使用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
时,None
为AnonymousUser
。其他装饰者没有帮助。
答案 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_session
中None
始终是ws_connect
,这违反了我们的目的。
我已经通过检查用户在视图中是否为匿名 来解决此问题,如果是,则表示他没有会话(或者至少渠道看不到该会话) ),初始化一个,然后为键get_user
分配值"AnonymousUser" + str(uuid.uuid4())
(以前是在使用者中使用的方法)。
完成此操作后,每次ws_connect
都被称为message
时,将具有一个http_session
属性:登录时的用户ID或AnonymousUser-uuid.uuid4()
。 / p>