Django 中如何使用 URL 包装器来处理 WebSockets?

2023-04-11 00:00:00 django 如何使用 WebSockets

Django 默认不支持 WebSockets,但可以使用第三方包装器,如 Django Channels。下面是使用 Django Channels 处理 WebSockets 的步骤:

  1. 安装 Django Channels:
pip install channels
  1. 在 Django 项目的 settings.py 文件中添加以下内容:
INSTALLED_APPS = [
    # ...
    'channels',
]

ASGI_APPLICATION = 'myproject.routing.application'
  1. 创建一个 routing.py 文件并添加以下内容:
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from django.urls import path
from myapp.consumers import MyConsumer

websocket_urlpatterns = [
    path('ws/', MyConsumer.as_asgi()),
]

application = ProtocolTypeRouter({
    'websocket': AuthMiddlewareStack(
        URLRouter(
            websocket_urlpatterns
        )
    ),
})

上述代码中,MyConsumer 是自定义的消费者,as_asgi() 是将消费者转换成 ASGI 应用程序的方法。

  1. 创建消费者(consumers.py 文件),并添加以下内容:
from channels.generic.websocket import WebsocketConsumer

class MyConsumer(WebsocketConsumer):
    def connect(self):
        self.accept()

    def disconnect(self, close_code):
        pass

    def receive(self, text_data):
        self.send(text_data=json.dumps({
            'message': 'Received: {}'.format(text_data)
        }))

上述代码中,MyConsumer 继承自 WebsocketConsumer,connect() 方法在连接建立时被调用,disconnect() 方法在连接关闭时被调用,receive() 方法在接收到消息时被调用,可以在该方法中处理消息并发送响应。

  1. 启动 Django 服务器,并使用 JavaScript 或其他客户端工具连接到 WebSocket URL:ws://localhost:8000/ws/。
<script>
    var socket = new WebSocket("ws://localhost:8000/ws/");

    socket.onopen = function(event) {
        console.log('WebSocket connected.');
        socket.send('Hello from client.');
    };

    socket.onmessage = function(event) {
        console.log('Received: ' + event.data);
    };

    socket.onclose = function(event) {
        console.log('WebSocket disconnected.');
    };
</script>

上述代码中,创建 WebSocket 对象并连接到 URL,使用 onopen、onmessage 和 onclose 事件处理程序分别处理连接建立、接收消息和关闭连接的事件。

通过以上步骤,就可以在 Django 中使用 URL 包装器来处理 WebSockets。例子中的字符串范例为:“pidancode.com”、“皮蛋编程”。

相关文章