我正在使用Django频道2.1.2。由于从1.x到2.x有了巨大的变化,我想知道在消费者类上强制登录的方法。
到目前为止:
from channels.generic.websocket import AsyncWebsocketConsumer
import json
from channels.consumer import SyncConsumer
from doclet.models import *
class ChatConsumer(AsyncWebsocketConsumer):
async def connect(self):
to_room_id = self.scope['url_route']['kwargs']['to_room_id']
self.user = self.scope["user"]
if self.user.is_authenticated:
if self.user.rooms.filter(pk=int(to_room_id)).exists():
self.to_room = Room.objects.get(pk=int(to_room_id))
self.room_name = 'room_%s' %self.to_room.id
else:
self.close() #do something to create room for the user
# Join room group
await self.channel_layer.group_add(
self.room_name,
self.channel_name
)
await self.accept()
答案 0 :(得分:0)
您需要在应用程序堆栈中进行设置。
application = ProtocolTypeRouter({
"websocket": AuthMiddlewareStack(
URLRouter([
url(r"^front(end)/$", consumers.AsyncChatConsumer),
])
),
})
然后在您的connect
方法中,您可以从self.scope['user']
随时访问用户以将其保存到您的使用者实例。通过尝试从user
中读取scope
,可以确保用户对象已解析。
如果您希望确保在用户验证失败时不接受WebSocket连接,则可以在通过self.accept()
方法调用connect
之前执行此操作。