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