如何详细实现Django3的Websockets直接添加方法?

2026-06-09 17:1525阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1097个文字,预计阅读时间需要5分钟。

如何详细实现Django3的Websockets直接添加方法?

Django 3.0 支持ASGI,可直接集成Websockets,无需额外依赖。以下是如何通过扩展默认ASGI应用程序来使用Django处理Websocket的简单介绍:

1. 创建ASGI应用:首先,创建一个基本的ASGI应用,这将作为Websocket通信的入口点。

2.配置路由:设置路由,将WebSocket连接映射到相应的处理函数。

3.编写WebSocket处理函数:实现处理WebSocket连接的逻辑,如接收消息、发送消息等。

4.运行ASGI服务器:使用支持ASGI的服务器(如Uvicorn)启动应用,以支持WebSocket通信。

示例代码如下:

python

asgi_app.pyfrom django.urls import pathfrom channels.routing import ProtocolTypeRouter, URLRouterfrom channels.auth import AuthMiddlewareStackimport myapp.routing

如何详细实现Django3的Websockets直接添加方法?

application=ProtocolTypeRouter({ http: URLRouter( myapp.routing.websocket_urlpatterns, ), websocket: AuthMiddlewareStack( URLRouter( myapp.routing.websocket_urlpatterns, ) ),})

myapp/routing.pyfrom django.urls import pathfrom . import consumers

websocket_urlpatterns=[ path('ws/websocket/', consumers.WebsocketConsumer.as_asgi()),]

myapp/consumers.pyfrom channels.generic.websocket import AsyncWebsocketConsumerimport json

class WebsocketConsumer(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 }))

这样,您就可以通过Django处理WebSocket通信了。

现在Django 3.0附带了对ASGI的支持,将Websockets添加到Django应用中不需要任何额外的依赖关系。 在本文中,您将学习如何通过扩展默认的ASGI应用程序来使用Django处理Websocket。 我们将介绍如何在示例ASGI应用程序中处理Websocket连接,发送和接收数据以及实现业务逻辑。

入门

首先,您需要在计算机上安装Python> = 3.6。 Django 3.0仅与Python 3.6及更高版本兼容,因为它使用了async和await关键字。 完成Python版本设置后,创建一个项目目录并CD进入。 然后,将Django安装在virtualenv内,并在您的项目目录中创建一个新的Django应用:

$ mkdir django_websockets && cd django_websockets $ python -m venv venv $ source venv/bin/activate $ pip install django $ django-admin startproject websocket_app .

看一下Django应用程序的websocket_app目录。 您应该看到一个名为asgi.py的文件。 其内容如下所示:

import os from django.core.asgi import get_asgi_application os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'websocket_app.settings') application = get_asgi_application()

该文件提供了默认的Django ASGI设置,并公开了一个名为application的ASGI应用程序,可以使用uvicorn或daphne等ASGI服务器运行该应用程序。 在进一步介绍之前,让我们看一下ASGI应用程序的结构。

ASGI应用程序结构

ASGI或“异步服务器网关接口”是用于使用Python构建异步Web服务的规范。它是WSGI的精神继承者,WSGI已被Django和Flask等框架使用了很长时间。 ASGI使您可以使用Python的本机异步/等待功能来构建支持长期连接的Web服务,例如Websockets和Server Sent Events。

ASGI应用程序是一个异步函数,它带有3个参数:作用域(当前请求的上下文),接收(一个异步函数,可让您侦听传入的事件)和发送(一个异步函数,可将事件发送至客户端)。

在ASGI应用程序内部,您可以根据范围字典中的值路由请求。例如,您可以通过检查scope [‘type']的值来检查该请求是HTTP请求还是Websocket请求。要侦听来自客户端的数据,您可以等待接收功能。准备好将数据发送到客户端时,可以等待发送功能,然后将要发送给客户端的任何数据传递给客户端。让我们看一下这在示例应用程序中是如何工作的。

创建一个ASGI应用

在我们的asgi.py文件中,我们将使用我们自己的ASGI应用程序包装Django的默认ASGI应用程序功能,以便自己处理Websocket连接。为此,我们需要定义一个名为application的异步函数,该函数需要3个ASGI参数:scope,receive和send。将get_asgi_application调用的结果重命名为django_application,因为我们需要它处理HTTP请求。在我们的应用程序函数内部,我们将检查scope [‘type']的值以确定请求类型。如果请求类型为“ 127.0.0.1:8000 (Press CTRL+C to quit)

要测试Websocket连接,请在新选项卡中打开浏览器的开发工具。 在控制台中,创建一个名为ws的新Websocket实例,该实例指向ws:// localhost:8000 /。 然后将onmessage处理程序附加到将event.data记录到控制台的ws。 最后,调用ws.send('ping')将消息发送到服务器。 您应该看到值“ pong!”。 登录到控制台。

> ws = new WebSocket('ws://localhost:8000/') WebSocket {url: "ws://localhost:8000/", readyState: 0, bufferedAmount: 0, onopen: null, onerror: null, …} > ws.onmessage = event => console.log(event.data) event => console.log(event.data) > ws.send("ping") undefined pong!

恭喜! 现在,您知道了如何使用ASGI将Websocket支持添加到Django应用程序中。 去用它来制作很棒的东西。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。

本文共计1097个文字,预计阅读时间需要5分钟。

如何详细实现Django3的Websockets直接添加方法?

Django 3.0 支持ASGI,可直接集成Websockets,无需额外依赖。以下是如何通过扩展默认ASGI应用程序来使用Django处理Websocket的简单介绍:

1. 创建ASGI应用:首先,创建一个基本的ASGI应用,这将作为Websocket通信的入口点。

2.配置路由:设置路由,将WebSocket连接映射到相应的处理函数。

3.编写WebSocket处理函数:实现处理WebSocket连接的逻辑,如接收消息、发送消息等。

4.运行ASGI服务器:使用支持ASGI的服务器(如Uvicorn)启动应用,以支持WebSocket通信。

示例代码如下:

python

asgi_app.pyfrom django.urls import pathfrom channels.routing import ProtocolTypeRouter, URLRouterfrom channels.auth import AuthMiddlewareStackimport myapp.routing

如何详细实现Django3的Websockets直接添加方法?

application=ProtocolTypeRouter({ http: URLRouter( myapp.routing.websocket_urlpatterns, ), websocket: AuthMiddlewareStack( URLRouter( myapp.routing.websocket_urlpatterns, ) ),})

myapp/routing.pyfrom django.urls import pathfrom . import consumers

websocket_urlpatterns=[ path('ws/websocket/', consumers.WebsocketConsumer.as_asgi()),]

myapp/consumers.pyfrom channels.generic.websocket import AsyncWebsocketConsumerimport json

class WebsocketConsumer(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 }))

这样,您就可以通过Django处理WebSocket通信了。

现在Django 3.0附带了对ASGI的支持,将Websockets添加到Django应用中不需要任何额外的依赖关系。 在本文中,您将学习如何通过扩展默认的ASGI应用程序来使用Django处理Websocket。 我们将介绍如何在示例ASGI应用程序中处理Websocket连接,发送和接收数据以及实现业务逻辑。

入门

首先,您需要在计算机上安装Python> = 3.6。 Django 3.0仅与Python 3.6及更高版本兼容,因为它使用了async和await关键字。 完成Python版本设置后,创建一个项目目录并CD进入。 然后,将Django安装在virtualenv内,并在您的项目目录中创建一个新的Django应用:

$ mkdir django_websockets && cd django_websockets $ python -m venv venv $ source venv/bin/activate $ pip install django $ django-admin startproject websocket_app .

看一下Django应用程序的websocket_app目录。 您应该看到一个名为asgi.py的文件。 其内容如下所示:

import os from django.core.asgi import get_asgi_application os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'websocket_app.settings') application = get_asgi_application()

该文件提供了默认的Django ASGI设置,并公开了一个名为application的ASGI应用程序,可以使用uvicorn或daphne等ASGI服务器运行该应用程序。 在进一步介绍之前,让我们看一下ASGI应用程序的结构。

ASGI应用程序结构

ASGI或“异步服务器网关接口”是用于使用Python构建异步Web服务的规范。它是WSGI的精神继承者,WSGI已被Django和Flask等框架使用了很长时间。 ASGI使您可以使用Python的本机异步/等待功能来构建支持长期连接的Web服务,例如Websockets和Server Sent Events。

ASGI应用程序是一个异步函数,它带有3个参数:作用域(当前请求的上下文),接收(一个异步函数,可让您侦听传入的事件)和发送(一个异步函数,可将事件发送至客户端)。

在ASGI应用程序内部,您可以根据范围字典中的值路由请求。例如,您可以通过检查scope [‘type']的值来检查该请求是HTTP请求还是Websocket请求。要侦听来自客户端的数据,您可以等待接收功能。准备好将数据发送到客户端时,可以等待发送功能,然后将要发送给客户端的任何数据传递给客户端。让我们看一下这在示例应用程序中是如何工作的。

创建一个ASGI应用

在我们的asgi.py文件中,我们将使用我们自己的ASGI应用程序包装Django的默认ASGI应用程序功能,以便自己处理Websocket连接。为此,我们需要定义一个名为application的异步函数,该函数需要3个ASGI参数:scope,receive和send。将get_asgi_application调用的结果重命名为django_application,因为我们需要它处理HTTP请求。在我们的应用程序函数内部,我们将检查scope [‘type']的值以确定请求类型。如果请求类型为“ 127.0.0.1:8000 (Press CTRL+C to quit)

要测试Websocket连接,请在新选项卡中打开浏览器的开发工具。 在控制台中,创建一个名为ws的新Websocket实例,该实例指向ws:// localhost:8000 /。 然后将onmessage处理程序附加到将event.data记录到控制台的ws。 最后,调用ws.send('ping')将消息发送到服务器。 您应该看到值“ pong!”。 登录到控制台。

> ws = new WebSocket('ws://localhost:8000/') WebSocket {url: "ws://localhost:8000/", readyState: 0, bufferedAmount: 0, onopen: null, onerror: null, …} > ws.onmessage = event => console.log(event.data) event => console.log(event.data) > ws.send("ping") undefined pong!

恭喜! 现在,您知道了如何使用ASGI将Websocket支持添加到Django应用程序中。 去用它来制作很棒的东西。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。