Получение обновленных данных сеанса в потребителе 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 ) ()
Надеюсь, это кому-нибудь поможет