欢迎访问宙启技术站
智能推送

使用channels.auth中的AuthMiddlewareStack()保护你的DjangoChannels路由

发布时间:2023-12-17 04:47:23

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 的用户身份验证系统。