要在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了!