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 должны вызывать исключения, верно?

Вернуться на верх