Каналы Django: вход в сеанс с использованием потребителя не работает - PullRequest
0 голосов
/ 10 июля 2019

У меня есть SPA, построенный с использованием каналов django и Vue для внешнего интерфейса.

Когда пользователь впервые загружает веб-страницу, index.html обслуживается с помощью

url(r'^.*$', TemplateView.as_view(template_name='index.html'), name="app")

Затем интерфейс взаимодействует с сервером через веб-сокет.

Одним из отправленных сообщений может быть вход в систему с соответствующими учетными данными.

Я следовал инструкциям на https://channels.readthedocs.io/en/latest/topics/authentication.html для реализации входа через потребителя.

class MyConsumer(AsyncJsonWebsocketConsumer):

    async def connect(self):
        self.group_name = str(uuid.uuid1())
        print(self.scope['session'].session_key)
        self.user = self.scope["user"]

        # Join room group
        await self.channel_layer.group_add(
            self.group_name,
            self.channel_name
        )

        await self.accept()

        # User data
        await self.send(simplejson.dumps(dict(data=dict(socketid=self.group_name, user=dict(username=self.user.username or None)))))

    async def receive_json(self, jsdata):       
        kwargs = jsdata.get('kwargs', {})

        # Manage Login
        if is_login_message(jsdata): # This checks if the message is sent to do login
            user = authenticate(**kwargs)
            await login(self.scope, user)
            print('Saving login session')
            await database_sync_to_async(self.scope["session"].save)()
            await self.send(simplejson.dumps(dict(data=dict(user=dict(username=user.username)))))
            print(self.scope['session'].session_key)
            return

Все отлично работает. Я мог видеть, что ключ seesion печатается, когда пользователь входит в систему. Однако, когда я перезагружаю веб-страницу, сеанс не сохраняется. Он печатает None в методе connect . Я вижу, что файлы cookie не устанавливаются после входа в систему. Я ожидаю, что информация, отправляемая с сервера клиенту, когда запускается строка ниже, чтобы установить некоторые куки в браузере.

            await database_sync_to_async(self.scope["session"].save)()
            await self.send(simplejson.dumps(dict(data=dict(user=dict(username=user.username)))))

Но этого не происходит. В чем может быть проблема?

...