我有一个聊天应用程序,我只希望登录的用户能够连接到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-您的第一个消费者