Django Channels:将登录的用户保存到会话



根据文档:

如果你是WebSocket消费者,或者在第一个之后登录响应已在HTTP消费者中发送,会话被填充但不会自动保存-您必须呼叫作用域["session"].save()在您的消费者代码中登录后:

但是,我在实现这个时遇到了一些麻烦。

我首先得到我的用户:

def login(form_data):
try:
user = User.objects.get(username=form_data['username'])
except User.DoesNotExist:
return "This account doesn't exist."
password = form_data['password']
if check_password(password, user.password):
return user
else:
return "Incorrect Password."

然后按照这样的指示:

user = login(form_data)
async_to_sync(login)(self.scope, user)
self.scope["session"].save()
self.send(text_data=to_json({
'operation': 'set_user',
'success': True,
'message': "Loading User Data",
'object': {'username': user.username}
}))

它的作用是将用户带到页面并为消费者的生活设置页面。然而,似乎用户没有被保存到用户的会话,因为当我重新加载页面时,self.scope['user']再次返回AnonymousUser对象。

我是这样设置asgi.py的:

application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": AuthMiddlewareStack(
URLRouter(
routing.websocket_urlpatterns
)
),
})

同样,导航到其他页面确认我确实没有登录。我还能错过什么呢?

看起来您的login函数与channels.auth.login相冲突。更改它的名称应该可以修复它:

from channels.auth import login
def my_login(form_data):
try:
user = User.objects.get(username=form_data['username'])
except User.DoesNotExist:
return "This account doesn't exist."
password = form_data['password']
if check_password(password, user.password):
return user
else:
return "Incorrect Password."
user = my_login(form_data)
async_to_sync(login)(self.scope, user)
self.scope["session"].save()
self.send(text_data=to_json({
'operation': 'set_user',
'success': True,
'message': "Loading User Data",
'object': {'username': user.username}
}))

my_login返回的字符串也应该是异常,对吧?

最新更新