根据文档:
如果你是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
返回的字符串也应该是异常,对吧?