django-channels 2.x如何在使用者类上实现所需的登录?

时间:2018-07-26 17:22:23

标签: django django-models django-rest-framework django-channels

我正在使用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()

1 个答案:

答案 0 :(得分:0)

您需要在应用程序堆栈中进行设置。

application = ProtocolTypeRouter({

    "websocket": AuthMiddlewareStack(
        URLRouter([
            url(r"^front(end)/$", consumers.AsyncChatConsumer),
        ])
    ),

})

然后在您的connect方法中,您可以从self.scope['user']随时访问用户以将其保存到您的使用者实例。通过尝试从user中读取scope,可以确保用户对象已解析。

如果您希望确保在用户验证失败时不接受WebSocket连接,则可以在通过self.accept()方法调用connect之前执行此操作。