📜  安装 django 频道 (1)

📅  最后修改于: 2023-12-03 15:25:05.431000             🧑  作者: Mango

安装 Django Channels

简介

Django Channels 是一个基于 Django 和 Python3 的 WebSockets,以及协议变换工具包。它允许您在 Django 应用程序中运行异步代码,处理 WebSockets 连接,以及使用像 WebSocket、HTTP/2 和 ASGI 这样的协议。

安装方式
  1. 首先安装 asgiref

    pip install asgiref
    
  2. 安装 channels

    pip install channels
    
  3. 安装 channels-redis (可选)

    如果您希望使用 Redis 作为 Channels 的后端,请执行以下命令安装 channels-redis

    pip install channels-redis
    
配置
settings.py

为了告诉 Django 使用 Channels,您需要在 settings.py 文件中更改 ASGI_APPLICATIONCHANNEL_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 来处理真正的实时应用程序。