Django Channels: Сохранение вошедшего пользователя в сессию
Согласно docs:
Если вы находитесь в потребителе WebSocket или входите в систему после первого ответ был отправлен в потребителе http, сессия будет заполнена но не будет сохранена автоматически - вы должны вызвать scope["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
должны вызывать исключения, верно?