使用Django频道时,Django会话没有持久化,没有设置cookie

问题描述 投票:0回答:1

Django 3.0.6,Channels 2.4,Channels-Redis 2.4

我正在使用runserver和channels_redis在WSL / Ubuntu 18.04上进行开发] >>

我正在编写一个聊天应用程序,除了这个问题之外,整个应用程序都工作正常。我为未经身份验证的用户分配一个随机的用户名。我将此用户名保存到使用者中的self.scope['session']。对于经过身份验证的用户,正在浏览器中正确设置了csrftoken cookie和sessionid cookie。但是,即使我同时在使用者的scope['session']['user_name']方法中设置了非身份验证用户的connect变量并将其保存,该会话也未保存在django_session表中,因此未设置user_name Cookie在浏览器中。我正在使用异步使用者,并且正在使用正确的database_sync_to_async语法来保存会话,如在here所示的第一个示例代码的底部所示。

相关代码部分:

consumers.py:

from channels.generic.websocket import AsyncJsonWebsocketConsumer
from channels.db import database_sync_to_async
from chat.models import *


class ChatConsumer(AsyncJsonWebsocketConsumer):

    DIGITS = string.digits
    ANON_NUMBER_LENGTH = 7

    async def connect(self):
        self.room_name = self.scope['url_route']['kwargs']['room_name']
        self.room_group_name = f'chat_{self.room_name}'
        if not self.scope["user"].is_authenticated:
            if 'user_name' not in self.scope['session']:
                # Create user name session for anonymous user
                random_number = ''.join(random.choice(ChatConsumer.DIGITS) for i in range(ChatConsumer.ANON_NUMBER_LENGTH))
                self.scope['session']['user_name'] = f'Guest_{random_number}'
            await database_sync_to_async(self.scope["session"].save)()
        elif 'user_name' in self.scope['session']:
            # Remove user_name from session if present
            self.scope['session'].pop('user_name')
            await database_sync_to_async(self.scope["session"].save)()
        await self.accept()

routing.py:

from channels.auth import AuthMiddlewareStack

application = ProtocolTypeRouter({
    # (http->django views is added by default)
    'websocket': AuthMiddlewareStack(
        URLRouter(
            chat.routing.websocket_urlpatterns
        )
    ),    
})

上面的await database_sync_to_async(self.scope["session"].save)()语句显然正在执行而没有错误(打印之前的打印语句正常)。我什至尝试将SESSION_SAVE_EVERY_REQUEST设置为True设置为noted here(尽管我没想到会有所帮助),但是会话仍然无法持久。有什么建议吗?

Django 3.0.6,Channels 2.4,Channels-Redis 2.4我正在使用runserver和channels_redis在WSL / Ubuntu 18.04上进行开发,我正在编写一个聊天应用程序,并且除...之外,整个应用程序都可以正常工作,除了...

因此,渠道不支持在websocket使用者中设置cookie ... :(甚至在浏览器会尊重websocket升级响应中使用cookie的情况下,都有一些公开辩论。

但是,如果您确保用户在到达Websocket端点之前已经有一个会话(即使是匿名用户),那么您应该(如果使用数据库支持的会话)可以随时更新它(但是您将无法在客户端设置任何Cookie)。

django django-channels
1个回答
0
投票

因此,渠道不支持在websocket使用者中设置cookie ... :(甚至在浏览器会尊重websocket升级响应中使用cookie的情况下,都有一些公开辩论。

© www.soinside.com 2019 - 2024. All rights reserved.