Django Channels Group/channel_session是如何工作的?

4
似乎Group和channel_session可以跨多个消息会话和消费者持久存在。Channels是如何实现这一点的?
@channel_session_user_from_http
def ws_connect(message):
    # Add them to the right group
    message.channel_session['room'] = 'room name'
    Group("chat-%s" % message.user.username[0]).add(message.reply_channel)

@channel_session_user
def ws_disconnect(message):
    if 'room' in message.channel_session:
        print('room====', message.channel_session['room'])
    Group("chat-%s" % message.user.username[0]).discard(message.reply_channel)

我想设置一个长期存在的对象,类似于全局对象,可被每个消费者访问。
1个回答

0
你可以使用@channel_session(或者@channel_session_user)装饰器来实现这个功能。确保你的对象是可序列化的,然后就可以像这样将它添加到用户的通道会话中:
@channel_session_user_from_http
def ws_connect(message):
    message.session.myobject = {'test': True}

@channel_session_user
def ws_connect(message):
    print(message.session.myobject)   # should output {'test': True}

或者,只需像在Django中一样使用您的数据库或redis来持久化诸如此类的东西:

@channel_session_user_from_http
def ws_connect(message):
    redis_conn.set('my-persisted-key', "{'test': True}")

@channel_session_user
def ws_connect(message):
    print(redis_conn.get('my-persisted-key'))  # should output "{'test': True}"

我知道这已经很久了,但我如何从常规视图访问 message.session.myobject = {'test': True} - zerohedge
1
你不能使用@zerohedge,因为它们是独立的会话对象。你需要手动将session_key存储在某个地方,并从SessionStore获取会话。https://docs.djangoproject.com/en/2.0/topics/http/sessions/#using-sessions-out-of-views - Nick Sweeting
我的问题是为了更好地提出一个泛化的问题:https://stackoverflow.com/q/51187309/5013234 谢谢! - zerohedge
谢谢澄清。使用Channels 2,这是可能的吗?http://channels.readthedocs.io/en/latest/topics/sessions.html - zerohedge
在Channels 2中,可以在websocket处理程序内调用scope["session"].save(),将任何修改保存回HTTP会话中,并且该会话可以从视图中访问。 - Nick Sweeting
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接