【Python】Daphne:Django 异步服务的桥梁

news2024/12/23 16:27:03

在这里插入图片描述
Daphne 是 Django Channels 项目的一部分,专门用于为 Django 提供支持 HTTP、WebSocket、HTTP2 和 ASGI 协议的异步服务器。Daphne 是一个开源的 Python 异步服务器,它可以帮助开发者运行异步应用程序,并且非常适合与 Django Channels 一起使用,为 Django 项目增加实时通信的能力。

通过使用 Daphne,Django 开发者可以将传统的同步 HTTP 请求扩展为支持 WebSocket 和异步任务处理的高性能应用,从而更好地支持现代 Web 应用的实时功能。

在这里插入图片描述
华丽的分割线

⭕️宇宙起点

    • 🔨 Daphne 的主要特点
      • 1. 支持 ASGI 协议
      • 2. 与 Django Channels 集成
      • 3. 多协议支持
      • 4. 高性能异步处理
    • 📦 Daphne 的安装与使用
      • 1. 安装 Daphne
      • 2. 配置 ASGI 文件
      • 3. 配置 WebSocket 路由
      • 4. 创建 WebSocket Consumer
      • 5. 运行 Daphne 服务器
    • 🧱 应用场景
    • ♨️ 使用 Daphne 实现 WebSocket 通信
      • 1. 创建 Django 项目并安装依赖
      • 2. 配置 ASGI 文件
      • 3. 定义 WebSocket 路由
      • 4. 创建 WebSocket Consumer
      • 5. 在前端实现 WebSocket 连接
      • 6. 启动 Daphne 服务器
    • 🥇 高级功能
      • 1. 广播消息给多个客户端
      • 2. 使用 Redis 作为 Channel Layer 后端
    • 📥 下载地址
    • 💬 结语
    • 📒 参考文献


标题1

🔨 Daphne 的主要特点

1. 支持 ASGI 协议

Daphne 作为 ASGI(Asynchronous Server Gateway Interface)服务器的实现,支持异步通信。ASGI 是 WSGI 的异步版本,它允许处理长连接、并发任务和实时通信,使得应用可以支持 WebSocket、HTTP2 和 HTTP/1.1。

2. 与 Django Channels 集成

Daphne 与 Django Channels 深度集成,Channels 扩展了 Django 的功能,支持 WebSocket、长轮询(Long Polling)、后台任务等异步操作,而 Daphne 则是这个异步处理的基础。通过将 Channels 和 Daphne 配合使用,开发者可以轻松为 Django 项目增加实时功能。

3. 多协议支持

Daphne 不仅支持标准的 HTTP/1.1,还支持 WebSocket 和 HTTP2。通过这些协议,Daphne 能够同时处理传统的 HTTP 请求和实时 WebSocket 连接,特别适合需要双向通信的应用场景,如实时聊天应用、在线协作工具或在线游戏。

4. 高性能异步处理

得益于 ASGI 协议的异步能力,Daphne 可以处理大量并发请求,尤其是在 WebSocket 长连接场景中,Daphne 的异步特性可以显著减少系统开销,提高应用的响应速度和并发处理能力。


标题2

📦 Daphne 的安装与使用

Daphne 的安装和使用非常简单,它与 Django 项目无缝集成。下面我们将展示如何在 Django 项目中安装和配置 Daphne。

1. 安装 Daphne

在 Django 项目中,使用 pip 来安装 Daphne:

pip install daphne

安装完成后,Daphne 将成为 Django 项目的默认异步服务器,用于处理异步请求。

2. 配置 ASGI 文件

在 Django 项目中,为了使用 Daphne 处理 WebSocket 或其他异步请求,我们需要配置 ASGI 应用。创建一个 asgi.py 文件,该文件用于定义项目的 ASGI 应用:

# asgi.py
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
import myapp.routing

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')

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

在这个 asgi.py 文件中,我们使用 ProtocolTypeRouter 来处理多种协议。http 使用标准的 Django ASGI 应用处理 HTTP 请求,websocket 则配置了 WebSocket 的路由。

3. 配置 WebSocket 路由

接下来,配置 WebSocket 路由。在应用目录下创建 routing.py 文件,用于定义 WebSocket 的路由:

# myapp/routing.py
from django.urls import path
from . import consumers

websocket_urlpatterns = [
    path('ws/chat/', consumers.ChatConsumer.as_asgi()),
]

这里定义了一个 WebSocket 路由 /ws/chat/,当客户端与这个 URL 建立 WebSocket 连接时,会调用相应的 Consumer 处理 WebSocket 消息。

4. 创建 WebSocket Consumer

Consumer 是处理 WebSocket 消息的核心部分。在 myapp 应用中创建 consumers.py 文件,用于处理 WebSocket 的连接、接收消息等操作:

# myapp/consumers.py
import json
from channels.generic.websocket import AsyncWebsocketConsumer

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
        }))

在这个 Consumer 中,我们实现了三个异步方法:

  • connect():当客户端连接时调用,并接受 WebSocket 连接。
  • disconnect():处理连接关闭。
  • receive():处理接收客户端发送的消息,并返回相同的消息给客户端。

5. 运行 Daphne 服务器

现在,我们已经配置好了 ASGI 应用、WebSocket 路由和 Consumer,可以使用 Daphne 运行项目了。通过以下命令启动 Daphne 服务器:

daphne -u /tmp/daphne.sock myproject.asgi:application

或者直接运行在本地开发模式下:

daphne myproject.asgi:application

Daphne 将开始监听异步请求并处理 WebSocket 连接。


标题3

🧱 应用场景

Daphne 与 Django Channels 配合,为 Django 项目提供了强大的异步支持,特别适合以下应用场景:

  1. 实时聊天应用:Daphne 通过 WebSocket 提供双向通信能力,可以轻松构建实时聊天应用,实现即时消息的发送和接收。

  2. 在线游戏:在线多人游戏中,玩家之间需要实时通信,Daphne 的高并发处理能力和 WebSocket 支持,使得开发实时互动的游戏成为可能。

  3. 协作工具:像 Google Docs 这样的在线协作工具需要多个用户同时编辑和查看文档。Daphne 的异步通信能力可以帮助构建实时同步的应用。

  4. 实时数据分析:数据流处理和实时更新的数据仪表盘需要即时更新数据,Daphne 能够处理这种高频率的数据推送需求。


标题4

♨️ 使用 Daphne 实现 WebSocket 通信

1. 创建 Django 项目并安装依赖

首先,创建一个新的 Django 项目,并安装所需的依赖项,包括 daphnechannels

django-admin startproject myproject
cd myproject

# 安装 Django Channels 和 Daphne
pip install channels daphne

接下来,编辑 myproject/settings.py 文件,将 channels 添加到 INSTALLED_APPS,并指定 ASGI 应用:

# myproject/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'channels',  # 添加 Channels 应用
]

# 指定 ASGI 应用
ASGI_APPLICATION = 'myproject.asgi.application'

2. 配置 ASGI 文件

在项目根目录下创建 asgi.py 文件,配置 ASGI 应用程序以支持 HTTP 和 WebSocket:

# myproject/asgi.py
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
import myapp.routing

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')

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

3. 定义 WebSocket 路由

在应用中创建一个 routing.py 文件,用于定义 WebSocket 的路由。例如,在 myapp 应用下创建此文件并添加路由规则:

# myapp/routing.py
from django.urls import path
from . import consumers

websocket_urlpatterns = [
    path('ws/chat/', consumers.ChatConsumer.as_asgi()),
]

这个路由配置表示,当用户访问 /ws/chat/ 时,将会触发 ChatConsumer 处理 WebSocket 连接。

4. 创建 WebSocket Consumer

接下来,我们创建 WebSocket Consumer 来处理 WebSocket 的连接和消息。ChatConsumer 是一个异步 WebSocket 处理类,负责管理连接、接收消息和发送响应。

# myapp/consumers.py
import json
from channels.generic.websocket import AsyncWebsocketConsumer

class ChatConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        # 接受 WebSocket 连接
        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
        }))

ChatConsumer 包含三个主要的异步方法:

  • connect():当客户端尝试连接 WebSocket 时调用。通过 accept() 接受连接。
  • disconnect():当连接关闭时调用。
  • receive():当接收到消息时调用,并通过 send() 方法将响应消息发送回客户端。

5. 在前端实现 WebSocket 连接

为了与 WebSocket 进行通信,我们还需要在前端实现连接。以下是一个简单的 JavaScript 示例,用于连接 WebSocket 并发送/接收消息:

<!DOCTYPE html>
<html>
<head>
    <title>Chat with WebSocket</title>
</head>
<body>
    <h1>WebSocket Chat</h1>
    <input type="text" id="messageInput" placeholder="Type a message..." />
    <button onclick="sendMessage()">Send</button>

    <ul id="messages"></ul>

    <script>
        const chatSocket = new WebSocket('ws://localhost:8000/ws/chat/');

        chatSocket.onmessage = function(e) {
            const data = JSON.parse(e.data);
            const message = data.message;

            const messagesList = document.getElementById('messages');
            const newMessage = document.createElement('li');
            newMessage.textContent = message;
            messagesList.appendChild(newMessage);
        };

        function sendMessage() {
            const messageInput = document.getElementById('messageInput');
            const message = messageInput.value;
            chatSocket.send(JSON.stringify({ 'message': message }));
            messageInput.value = '';
        }
    </script>
</body>
</html>

在这个示例中,WebSocket 对象被用来连接后端的 WebSocket 路径 /ws/chat/,并且通过 send() 方法发送消息,onmessage 回调函数用于接收来自后端的消息并将其显示在页面上。

6. 启动 Daphne 服务器

一切配置好后,使用 Daphne 来启动 Django 项目并处理异步请求。运行以下命令启动 Daphne:

daphne -p 8000 myproject.asgi:application

Daphne 服务器将启动并监听 HTTP 和 WebSocket 请求。


标题5

🥇 高级功能

1. 广播消息给多个客户端

如果你希望将一条消息广播给多个 WebSocket 连接的客户端,可以使用 Channels 的 ChannelLayerChannelLayer 允许多个消费者在同一组内广播消息。以下是广播功能的实现:

修改 Consumer:

# myapp/consumers.py
from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync

class ChatConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        self.room_group_name = 'chat_room'

        # 将连接加入到组
        await self.channel_layer.group_add(
            self.room_group_name,
            self.channel_name
        )

        await self.accept()

    async def disconnect(self, close_code):
        # 从组中移除连接
        await self.channel_layer.group_discard(
            self.room_group_name,
            self.channel_name
        )

    async def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = text_data_json['message']

        # 将消息发送到组
        await self.channel_layer.group_send(
            self.room_group_name,
            {
                'type': 'chat_message',
                'message': message
            }
        )

    async def chat_message(self, event):
        message = event['message']

        # 发送消息到 WebSocket
        await self.send(text_data=json.dumps({
            'message': message
        }))

在这个例子中,当一个客户端发送消息时,receive() 方法会将消息广播到该组中的所有 WebSocket 连接。组内的所有连接都会收到相同的消息。

2. 使用 Redis 作为 Channel Layer 后端

为了支持横向扩展,Daphne 与 Channels 可以使用 Redis 作为消息队列(Channel Layer)。安装 channels-redis

pip install channels-redis

settings.py 中配置 Redis 作为 Channel Layer

# myproject/settings.py
CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [('127.0.0.1', 6379)],
        },
    },
}

这样,多个 Daphne 实例可以通过 Redis 实现消息广播和同步处理。


标题6

📥 下载地址


Daphne 最新版 下载地址


标题7

💬 结语

Daphne 是 Django 生态中不可或缺的一部分,它为开发者提供了构建异步应用的能力,尤其是当你需要处理实时通信、WebSocket 或高并发任务时。通过与 Django Channels 配合,Daphne 不仅可以支持传统的 HTTP 请求,还可以处理更复杂的 WebSocket 和异步任务,为现代 Web 应用的开发提供了强大的支持。

如果你正在开发需要实时通信或高并发的 Django 应用,Daphne 是一个强大的工具,它可以帮助你轻松实现异步功能和高性能应用。


标题8

📒 参考文献

  • Daphne GitHub仓库

TheEnd


在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2172982.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

回家啦回家啦

耒阳也有茶颜月色了&#xff0c;没忍住喝了一杯&#xff01; 衡阳卤粉&#xff0c;想出来的味道&#x1f445;&#xff0c;一般般 但一个粉店能做到24小时不打烊&#xff0c;应该也还行哈 银行竟然支持扫脸取钱了&#xff01;&#xff01;

【微服务即时通讯系统】——etcd一致性键值存储系统、etcd的介绍、etcd的安装、etcd使用和功能测试

文章目录 etcd1. etcd的介绍1.1 etcd的概念 2. etcd的安装2.1 安装etcd2.2 安装etcd客户端C/C开发库 3. etcd使用3.1 etcd接口介绍 4. etcd使用测试4.1 原生接口使用测试4.2 封装etcd使用测试 etcd 1. etcd的介绍 1.1 etcd的概念 Etcd 是一个基于GO实现的 分布式、高可用、一致…

通过OpenScada在ARMxy边缘计算网关上实现数字化转型

随着工业4.0概念的普及&#xff0c;数字化转型已成为制造业升级的关键路径之一。在此背景下&#xff0c;边缘计算技术因其能够有效处理大量数据、减少延迟并提高系统响应速度而受到广泛关注。ARMxy边缘计算网关&#xff0c;特别是BL340系列&#xff0c;凭借其强大的性能和灵活的…

--杂项2--

将之前实现的顺序表、栈、队列都更改成模板类 #include <iostream> #include <string.h> using namespace std;template <typename T> class Stack { private:T* a;int top;int size1;public:Stack(int c) : a(new T[c]), top(-1), size1(c) {}~Stack() { de…

IDEA 系列产品 下载

准备工作 下载 下载链接&#xff1a;https://www.123865.com/ps/EF7OTd-mbHnH 仅供参考 环境 演示环境&#xff1a; 操作系统&#xff1a;windows10 产品&#xff1a;IntelliJ IDEA 版本&#xff1a;2024.1.2 注意&#xff1a;如果需要其他产品或者版本可以自行下载&#xff0…

ArcEngine C#二次开发图层处理:根据属性分割图层(Split)

需求&#xff1a;仅根据某一属性&#xff0c;分割图层&#xff0c;并以属性值命名图层名称保存。 众所周知&#xff0c;ArcGIS ArcToolbox中通过Split可以实现图形分割一个图层&#xff0c;以属性值命名图层&#xff0c;如下图所示。 本文仅仅依据属性值&#xff0c;将一个shp…

Android界面控件概述

节选自《Android应用开发项目式教程》&#xff0c;机械工业出版社&#xff0c;2024年7月出版 做最简单的安卓入门教程&#xff0c;手把手视频、代码、答疑全配齐 控件是Android界面的重要组成单元&#xff0c;Android应用主要通过控件与用户交互&#xff0c;Android提供了非常…

YUView:YUV查看工具

文章目录 引言安装步骤使用YUView查看YUV数据播放与分析功能亮点注意事项 YUView的架构设计 引言 本文将介绍如何在Ubuntu 20.04上安装YUView&#xff0c;并分享其基本使用方法。 安装步骤 安装依赖项 在开始安装YUView前&#xff0c;先确保安装了所有必需的依赖包。打开终…

VGA/HDMI/DP接口和USB、串口通信协议

1、视频接口 开始之前我们先聊一聊数字信号和模拟信号&#xff0c;模拟信号和数字信号的不同之处在于它们所传输的信息的形式。模拟信号是一个连续的信号&#xff0c;可以以在无限小的时间内进行测量。数字信号则是以离散的形式进行传输&#xff0c;它的数值只能是离散的、有限…

每日一题学习笔记

给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个中间结点&#xff0c;提示&…

Unity中的GUIStyle错误:SerializedObject of SerializedProperty has been Disposed.

一运行就循环打印这个报错&#xff0c; 解决办法&#xff0c;每次改参数之后在HIerarchy中手动保存&#xff0c;就会停止循环打印&#xff0c;style中的字体也显示出来了&#xff0c; 或者 直接换个低版本的

如何使用C语言接入Doris数据库

如何使用C语言接入Doris数据库 一、环境准备1. 安装MySQL C API2. Doris数据库环境二、编写C语言接入代码1. 包含必要的头文件2. 编写连接和查询函数3. 编译和运行程序三、注意事项1. 安全性2. 错误处理3. 性能优化4. 兼容性5. 调试和日志记录四、结论Doris(之前称为Palo或Apa…

SQL高可用优化-优化SQL中distinct和Where条件对索引字段进行非空检查语句

最近做一个需求&#xff0c;关于SQL高可用优化&#xff0c;需要优化项目中的SQL&#xff0c;提升查询效率。 SQL高可用优化 一、优化SQL包含distinct场景二、优化SQL中Where条件中索引字段是否为NULL三、代码验证1. NodeMapper2. NodeService3. NodeController4.数据库数据5.项…

《西安交通大学学报》

投稿须知 感谢你对本刊的信任和支持。为了更好地为你服务&#xff0c;保证你的稿件能够顺利通过专家审稿&#xff0c;乃至及时录用发表&#xff0c;现将向本刊投稿时需要注意的事项罗列如下。   &#xff08;1&#xff09;本刊面向国内外公开征稿&#xff0c;校外作者的稿件要…

Linux系统文件的基础IO

目录 一、C语言的文件IO操作 二、系统调用的文件IO操作 1.open打开文件 2.close关闭文件 3.write写入文件 4.read读取文件 三、文件描述符 四、文件描述符的分配规则 五、终端文件 六、C语言中的文件IO对比系统调用文件IO 文件I/O&#xff08;Input/Output&#xff0…

信安 实验2,3 使用Gpg4win进行数字签名、发送加密电子邮件

我发现了有些人喜欢静静看博客不聊天呐&#xff0c; 但是ta会点赞。 这样的人呢帅气低调有内涵&#xff0c; 美丽大方很优雅。 说的就是你&#xff0c; 不用再怀疑哦 实验2 使用Gpg4win进行数字签名 实验目的 通过实验&#xff0c;让学生掌握使用RSA算法实施数字签名的…

【1米C-SAR卫星】

1米C-SAR卫星 1米C-SAR卫星是我国自主研发的重要遥感卫星&#xff0c;主要用于海洋、陆地等观测任务&#xff0c;具备高分辨率、宽覆盖、多极化、多模式等特点。以下是对1米C-SAR卫星的详细介绍&#xff1a; 一、基本概况 发射时间&#xff1a;首颗1米C-SAR卫星于2021年11月2…

谁能给我一个ai现在无法替代画师的理由?

小白可做&#xff01;全自动AI影视解说一键成片剪辑工具https://docs.qq.com/doc/DYnl6d0FLdHp0V2ll 如何看待现如今的AI绘画 哎呀玫瑰花来了&#xff0c;所有花式都要玩完了。 我相信大家在网上已经看过了太多惊为天人的AI绘画作品&#xff0c;有人抵制&#xff0c;有人支持&a…

PMP--二模--解题--141-150

文章目录 14.敏捷--创建敏捷环境--团队构成--混合项目环境&#xff0c;通常是自组织团队&#xff0c;即团队成员自己决定谁做什么&#xff0c;而不是项目经理决定。易混--常见场景--一个新人加入141、 [单选] 在一个混合项目的执行过程中&#xff0c;不得不更换一个开发人员。新…

【爱给网:登录_注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…