У меня есть 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)))))
Но этого не происходит. В чем может быть проблема?