Получение обновленных данных сеанса в потребителе Django Channels

В документации по каналам Django говорится следующее о сохранении сессий:

Однако если вы находитесь в потребителе WebSocket, сессия будет заполнена, но никогда не будет сохранена автоматически - вы должны вызвать scope["session"].save()

.

Однако я заметил, что это не работает в обратную сторону, например, если данные сессии изменяются представлением, эти изменения не влияют на версию состояния сессии, доступную изнутри потребителя (даже при применении request.session.modified = True)

В процессе поиска решения я обнаружил несколько вопросов без ответов, в которых обсуждалась та же проблема. И похоже, что она не рассматривается в документации (возможно, она где-то упоминается, но мне не удалось ее найти), поэтому я решил опубликовать свое решение. Пожалуйста, прокомментируйте, если оно по каким-то причинам не является правильным.

Например, вы хотите получить обновленные данные сессии внутри receive метода AsyncWebsocketConsumer дочернего класса.

class MyConsumer(AsyncWebsocketConsumer):
async def receive(self, data):
   current_session_data = await sync_to_async ( self.scope["session"].load) ()

load возвращает dict со всеми переменными сессии. self.scope["session"] не является dict, но имеет метод update, который обновляет базовый dict:

self.scope['session'].update( current_session_data )
await sync_to_async ( self.scope["session"].save ) ()

Надеюсь, это кому-нибудь поможет

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