Django Channels 会话不是持久的。断开连接 -> 注销

Django Channels session is not persistent. disconnect -> logged out

我有一个 websocket 路由器:

application = ProtocolTypeRouter({
    'websocket': 
    AllowedHostsOriginValidator(
        AuthMiddlewareStack(
            URLRouter(
                [
                    url("ws/", Consumer)
                ]
            )
        )
    )
})

我正在通过向 websocket 发送命令来登录用户。用户这样登录:

if cmd == 'login':
    user = await database_sync_to_async(authenticate)(consumer.scope, email=request['eMail'], password=request['pass'])
    if user is not None:
        # login the user to this session.
        await login(consumer.scope, user, backend='allauth.account.auth_backends.AuthenticationBackend')
        # save the session
        consumer.scope['session'].modified = True
        await database_sync_to_async(consumer.scope['session'].save)()

每次,websocket 连接断开,用户不再登录。 我想,会话被

保存了
consumer.scope['session'].save()

但它不起作用。会话不持久。

我该如何解决这个问题?

您在 Django 中使用哪个会话后端。

由于网络套接字在创建连接后的工作方式,您无法设置任何 cookie,因此如果您使用依赖于 cookie 存储的会话后端,save 将无效,因为网络浏览器无法更新。

目前频道甚至不支持在 accept 方法中设置 cookie。 https://github.com/django/channels/issues/1096#issuecomment-619590028

但是,如果您确保您的用户已经有一个会话 cookie,那么您可以 upgrade 该会话到已登录的用户。