使用channels.auth中的AuthMiddlewareStack()保护你的DjangoChannels路由
Django Channels 是一个在 Django 中支持实时通信和 WebSocket 的框架。要保护 Channels 路由,可以使用 channels.auth 中的 AuthMiddlewareStack()。AuthMiddlewareStack() 中间件可以确保 WebSocket 连接的每个请求都通过 Django 的身份验证系统进行身份验证。
下面是一个使用 AuthMiddlewareStack() 保护 Django Channels 路由的实例。假设你有一个基于 Django 的实时聊天应用程序,用户必须通过身份验证才能进入聊天系统:
1. 首先,在 Django 项目的根目录下的 asgi.py 文件中,将 Channels 的路由导入:
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
application = ProtocolTypeRouter({
'http': get_asgi_application(),
'websocket': URLRouter(
# 将聊天应用的路由导入
chat.routing.websocket_urlpatterns
),
})
2. 在 Django 项目的根目录下,创建一个名为 middleware.py 的文件,并添加以下代码:
from channels.auth import AuthMiddlewareStack
def get_default_application():
"""
将 AuthMiddlewareStack 包裹在项目的默认应用程序中
"""
return AuthMiddlewareStack(application)
3. 确保在项目的 settings.py 文件中,设置 CHANNEL_LAYERS 参数:
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
"hosts": [('localhost', 6379)],
},
},
}
4. 确保在项目的 settings.py 文件中,将 middleware.py 添加到 MIDDLEWARE 中:
MIDDLEWARE = [
...
'myproject.middleware.get_default_application',
]
现在,你的 Django Channels 路由将由 AuthMiddlewareStack() 保护,要求用户进行身份验证才能连接到 WebSocket。
下面是一个使用 AuthMiddlewareStack() 的简单示例:
1. 创建一个名为 chat/consumers.py 的文件,并添加以下代码:
from channels.generic.websocket import AsyncWebsocketConsumer
import json
class ChatConsumer(AsyncWebsocketConsumer):
async def connect(self):
# 使用身份验证中间件验证用户
if self.scope["user"].is_anonymous:
await self.close()
else:
await self.accept()
async def receive(self, text_data):
# 接收来自前端的消息
text_data_json = json.loads(text_data)
message = text_data_json['message']
# 在后端进行处理和验证
# 发送消息给所有连接的 WebSocket 客户端
await self.channel_layer.group_send(
'chat_room',
{
'type': 'chat_message',
'message': message
}
)
async def chat_message(self, event):
# 将消息发送到连接的 WebSocket 客户端
message = event['message']
await self.send(text_data=json.dumps({
'message': message
}))
2. 在 chat/routing.py 文件中,添加以下代码:
from django.urls import path
from .consumers import ChatConsumer
websocket_urlpatterns = [
path('ws/chat/', ChatConsumer.as_asgi()),
]
3. 运行 Channels 服务器:
$ python manage.py runserver
现在,你的聊天应用程序的 WebSocket 路由已经被 AuthMiddlewareStack() 保护起来了。只有经过身份验证的用户才能连接到 WebSocket 并发送/接收消息。
注意:要使上述示例起作用,你还需要配置 Redis 作为 Channels 的消息传输层。此外,确保将用户身份验证视图和 URL 配置为正确的路径并配置好 Django 的用户身份验证系统。
