Django 实现WebSocket

要在Django中实现WebSocket,你需要使用一个称为Django Channels的第三方库。
安装Django Channels:
pip install channels
创建Django Channels配置:
在你的项目目录下,创建一个名为routing.py的文件,并添加以下内容:
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from django.urls import path

application = ProtocolTypeRouter({
    "websocket": AuthMiddlewareStack(
        URLRouter(
            [
                path("ws/your-path/", your_consumer),
            ]
        )
    ),
})

# 该配置文件将路由WebSocket请求到具有给定路径的您自定义的consumer。
创建WebSocket consumer:
在你的应用程序目录下,创建一个名为consumers.py的文件,并添加以下内容:
from channels.generic.websocket import AsyncWebsocketConsumer

class YourConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        await self.accept()

    async def disconnect(self, close_code):
        pass

    async def receive(self, text_data):
        await self.send(text_data=text_data)
        
# 这是一个简单的consumer,它接受WebSocket连接并回复任何文本数据。
在你的Django应用程序中使用WebSocket:
在你的视图中添加以下代码:
from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync

def your_view(request):
    channel_layer = get_channel_layer()
    async_to_sync(channel_layer.group_send)(
        "your-group-name",
        {
            "type": "websocket.send",
            "text": "Hello world!",
        }
    )
    return HttpResponse("Message sent")

# 该视图使用get_channel_layer函数获取Channel层对象,并使用async_to_sync函数发送消息。
在你的consumer中,你可以使用self.channel_layer.group_add方法将连接添加到特定的群组中。
await self.channel_layer.group_add(
    "your-group-name",
    self.channel_name
)
并在disconnect方法中删除该连接:
await self.channel_layer.group_discard(
    "your-group-name",
    self.channel_name
)
最后,你可以使用self.send方法发送消息。
await self.send(text_data="Hello world!")

# 现在你已经可以使用WebSocket了!

posted on 2023-03-08 23:16  cloud_wh  阅读(214)  评论(0编辑  收藏  举报

导航