Django 默认情况下并不支持 WebSocket,但你可以通过集成第三方库如 channels 来实现 WebSocket 功能。channels 是一个 Django 应用,它提供了对 WebSocket、HTTP2 和其他协议的支持。
下面是如何在 Django 项目中使用 WebSocket 的基本步骤:
一:安装 channels
首先,你需要安装 channels 和 channels-redis(用于消息传递):
pip install channels channels-redis
二:配置项目
在你的 settings.py 中,添加以下配置:
# INSTALLED_APPS
INSTALLED_APPS = [
# ...
'channels',
]
# Channels 配置
ASGI_APPLICATION = 'your_project.routing.application'
# Channels layers 配置
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
"hosts": [('127.0.0.1', 6379)],
},
},
}
三:创建路由
在 your_project 目录下创建一个名为 routing.py 的文件,并添加以下内容
from django.urls import path
from your_app.consumers import YourConsumer
websocket_urlpatterns = [
path('ws/your-path/', YourConsumer.as_asgi()),
]
四:创建 Consumer
在你的应用中创建一个名为 consumers.py 的文件,并添加一个Consumer
from channels.generic.websocket import AsyncWebsocketConsumer
import json
class YourConsumer(AsyncWebsocketConsumer):
async def connect(self):
# 当 WebSocket 连接建立时,此方法会被调用
await self.accept()
async def disconnect(self, close_code):
# 当 WebSocket 连接关闭时,此方法会被调用
pass
async def receive(self, text_data=None, bytes_data=None):
# 当从客户端接收到消息时,此方法会被调用
data = json.loads(text_data)
# 处理接收到的数据
pass
async def your_custom_method(self, data):
# 你可以定义自己的方法来处理特定逻辑
# 然后从其他地方调用这个方法
pass
async def send_message_to_client(self, message):
# 发送消息给客户端
await self.send(text_data=json.dumps(message))
五:前端连接 WebSocket
在前端,你可以使用原生的 WebSocket API 或其他库(如 socket.io)来连接你的 WebSocket 服务。以下是一个使用原生 API 的示例
const ws = new WebSocket('ws://your-domain/ws/your-path/');
ws.onopen = function(event) {
console.log("WebSocket 已连接");
ws.send(JSON.stringify({ your_data: 'here' }));
};
ws.onmessage = function(event) {
const data = JSON.parse(event.data);
console.log("接收到数据:", data);
};
ws.onclose = function(event) {
console.log("WebSocket 已关闭");
};
ws.onerror = function(error) {
console.error("WebSocket 错误:", error);
};
六:运行项目
使用 Daphne 或 Daphne + Runserver 运行你的项目:
daphne your_project.asgi:application
或python manage.py runserver