📅  最后修改于: 2023-12-03 15:25:05.431000             🧑  作者: Mango
Django Channels 是一个基于 Django 和 Python3 的 WebSockets,以及协议变换工具包。它允许您在 Django 应用程序中运行异步代码,处理 WebSockets 连接,以及使用像 WebSocket、HTTP/2 和 ASGI 这样的协议。
首先安装 asgiref
pip install asgiref
安装 channels
pip install channels
安装 channels-redis
(可选)
如果您希望使用 Redis 作为 Channels 的后端,请执行以下命令安装 channels-redis
pip install channels-redis
settings.py
为了告诉 Django 使用 Channels,您需要在 settings.py
文件中更改 ASGI_APPLICATION
和 CHANNEL_LAYERS
变量。
ASGI_APPLICATION = 'myproject.routing.application' # 您可以将名称替换为您的应用程序的名称
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels.layers.InMemoryChannelLayer"
},
}
如果您决定使用 Redis 作为 Channels 的后端,请在 CHANNEL_LAYERS
中添加以下内容:
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": [("localhost", 6379)],
},
},
}
routing.py
下一步是在您的项目中创建 routing.py
文件。这个文件将告诉 Channels 如何处理 WebSockets 连接。
这是一个简单的 routing.py
的例子,用于在 localhost:8000/chat
上处理 WebSocket 连接:
from django.urls import re_path
from . import consumers
websocket_urlpatterns = [
re_path(r'ws/chat/(?P<room_name>\w+)/$', consumers.ChatConsumer.as_asgi()),
]
consumers.py
最后,您需要创建一个 consumers.py
文件来定义如何处理 WebSocket 连接。 在 consumers.py
文件中,您需要创建一个继承自 channels.generic.websocket.WebSocketConsumer
的类。
from channels.generic.websocket import AsyncWebsocketConsumer
import json
class ChatConsumer(AsyncWebsocketConsumer):
async def connect(self):
await self.accept()
async def disconnect(self, close_code):
pass
async def receive(self, text_data):
text_data_json = json.loads(text_data)
message = text_data_json['message']
await self.send(text_data=json.dumps({
'message': message
}))
现在您已经完成了设置,能够使用 Channels 来处理 WebSocket 连接了。在您的应用程序中,您需要创建一个 JavaScript 客户端,连接到您的 WebSocket 服务器。
var roomName = "myRoom";
var socket = new WebSocket
(
'ws://'
+ window.location.host
+ '/ws/chat/'
+ roomName
+ '/'
);
socket.onmessage = function(e) {
var data = JSON.parse(e.data);
console.log(data.message);
}
Channels 是一个非常强大的 Django 应用程序,可使您的应用程序处理 websocket 连接,以及使用 WebSocket、HTTP/2 和 ASGI 这样的协议。只需简单的几步配置,您就可以开始使用 Channels 来处理真正的实时应用程序。