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
该会话到已登录的用户。
我有一个 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
该会话到已登录的用户。