如何只允许登录用户连接Django Channels中的websocket



我有一个聊天应用程序,我只希望登录的用户能够连接到websocket。

你怎样才能做到这一点?

Django频道有类似@login_required装饰器的东西吗?

我从文档中知道,这就是你可以访问用户的方式:

class ChatConsumer(WebsocketConsumer):
def connect(self, event):
self.user = self.scope["user"]

但是,如果用户没有登录,如何拒绝连接?

我找到了问题的答案:

# mysite/routing.py
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import chat.routing
application = ProtocolTypeRouter({
# (http->django views is added by default)
'websocket': AuthMiddlewareStack(
URLRouter(
chat.routing.websocket_urlpatterns
)
),
})
class ChatConsumer(WebsocketConsumer):
def connect(self):
self.user = self.scope['user']
if self.user.is_authenticated:
# accept connection if user is logged in
self.accept()
else:
# don't accept connection if user is not logged in 
self.close()

AuthMiddlewareStack将使用对当前已验证用户的引用填充连接的范围,类似于Django的AuthenticationMiddleware如何使用当前已验证的用户填充视图函数的请求对象。

添加AuthMiddlewareStack的示例如下:

# mysite/routing.py
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import chat.routing
application = ProtocolTypeRouter({
# (http->django views is added by default)
'websocket': AuthMiddlewareStack(
URLRouter(
chat.routing.websocket_urlpatterns
)
),
})

参考:https://channels.readthedocs.io/en/latest/tutorial/part_2.html#write-您的第一个消费者

最新更新