当前位置: 首页 > news >正文

Python Daphne库:ASGI服务的高效Web服务器

e3083bcde54699ec5b37a0efc4aeeb47.png

更多Python学习内容:ipengtao.com

随着 Web 开发技术的不断发展,异步编程逐渐成为构建高性能 Web 应用的主流方式。传统的 WSGI 接口已经不能满足现代异步 Web 应用的需求。ASGI(Asynchronous Server Gateway Interface)作为 WSGI 的异步版,提供了对 WebSocket、HTTP2、以及长连接等异步特性的支持。Daphne 是 Python 生态系统中用于运行 ASGI 应用的轻量级 Web 服务器,特别适合与 Django Channels 等库配合使用,实现异步 Web 和 WebSocket 应用。本文将详细介绍 Daphne 库的安装、主要功能、基础与进阶操作及其在实际项目中的应用。

安装

要使用 Daphne 运行 ASGI 应用,首先需要在系统中安装它。

Daphne 可以通过 Python 包管理器 pip 进行安装:

pip install daphne

安装完成后,验证安装是否成功:

daphne --version

Daphne 通常与 Django Channels 搭配使用,但它也可以独立运行 ASGI 应用。如果使用 Django 框架,还需要确保安装了 Django Channels:

pip install channels

主要功能

Daphne 是一个高效、轻量的 Web 服务器,支持运行异步应用。它不仅支持 HTTP 和 WebSocket 协议,还支持 HTTP2、HTTPS 等现代协议。

其核心功能包括:

  • 运行 ASGI 应用(异步 Web 和 WebSocket 支持)

  • 支持 HTTP 和 WebSocket 协议

  • 与 Django Channels 集成,支持实时通信和长连接应用

  • 支持异步任务、事件循环

这些特性使得 Daphne 成为构建现代 Web 应用和实时通信系统的理想选择。

基础功能

启动 ASGI 应用

Daphne 的主要用途是运行 ASGI 应用。一个简单的 ASGI 应用可以通过以下代码定义:

async def app(scope, receive, send):if scope['type'] == 'http':await send({'type': 'http.response.start','status': 200,'headers': [(b'content-type', b'text/plain')],})await send({'type': 'http.response.body','body': b'Hello, world!',})

在这个 ASGI 应用中,定义了一个简单的 HTTP 响应,返回 "Hello, world!" 文本。

要运行这个 ASGI 应用,可以使用 Daphne 服务器:

daphne app:app

在这里,app:app 表示 app.py 文件中的 app 对象。启动后,Daphne 将监听 HTTP 请求,并返回对应的响应。

与 Django Channels 集成

Daphne 通常与 Django Channels 配合使用,用于处理异步 WebSocket 连接。要在 Django 中使用 Daphne,首先需要配置 Channels:

1.在 settings.py 中添加 Channels 配置:

INSTALLED_APPS = ['channels',# 其他应用
]ASGI_APPLICATION = 'myproject.asgi.application'

2.创建 asgi.py 文件以配置 ASGI 应用:

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

3.使用 Daphne 启动 Django 项目:

daphne myproject.asgi:application

通过这些步骤,Django 项目将能够支持异步 WebSocket 连接和 HTTP 请求。

WebSocket 支持

Daphne 的一个核心优势是其对 WebSocket 的原生支持。

可以通过以下代码定义一个简单的 WebSocket 应用:

async def websocket_app(scope, receive, send):while True:event = await receive()if event['type'] == 'websocket.connect':await send({'type': 'websocket.accept'})elif event['type'] == 'websocket.receive':message = event['text']await send({'type': 'websocket.send','text': f'You said: {message}',})elif event['type'] == 'websocket.disconnect':break

在这个应用中,Daphne 处理 WebSocket 连接、接收消息并返回响应。

要启动该应用,可以使用:

daphne websocket_app:app

通过 Daphne 的 WebSocket 支持,你可以轻松构建实时聊天应用、通知系统或其他需要长连接的应用程序。

进阶功能

使用 HTTPS

Daphne 支持 HTTPS 协议,可以通过设置证书来启用安全连接。

要配置 HTTPS,可以使用以下命令:

daphne -b 0.0.0.0 -p 443 --ssl-keyfile key.pem --ssl-certfile cert.pem myproject.asgi:application

在这个示例中,通过 --ssl-keyfile--ssl-certfile 参数指定了 SSL 证书和密钥文件,启用了 HTTPS 支持。

多端口监听

Daphne 允许同时监听多个端口,处理不同类型的协议。

例如,可以同时监听 HTTP 和 WebSocket 的请求:

daphne -u /tmp/daphne.sock -b 0.0.0.0 -p 8000 myproject.asgi:application

通过使用 Unix 套接字或多个端口,Daphne 可以处理多个不同的服务需求,适应多种场景。

负载均衡和横向扩展

Daphne 可以与负载均衡器(如 Nginx)结合使用,分担流量并实现应用的横向扩展。在生产环境中,Daphne 通常被设置为 Nginx 的后端服务,Nginx 负责处理静态文件和 SSL,Daphne 负责处理动态请求。

以下是 Nginx 配置示例:

server {listen 80;server_name mydomain.com;location / {proxy_pass http://localhost:8001;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $host;}
}

这种设置使得应用能够承载更多的请求,提高系统的性能和稳定性。

实际应用

实时聊天系统

通过 Daphne 的 WebSocket 支持,可以构建一个简单的实时聊天系统。以下是一个使用 Django Channels 实现的示例:

1.创建一个 consumers.py 文件以定义 WebSocket 消费者:

from channels.generic.websocket import AsyncWebsocketConsumer
import jsonclass ChatConsumer(AsyncWebsocketConsumer):async def connect(self):await self.accept()async def disconnect(self, close_code):passasync 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}))

2.配置路由以处理 WebSocket 连接:

from django.urls import re_path
from . import consumerswebsocket_urlpatterns = [re_path(r'ws/chat/$', consumers.ChatConsumer.as_asgi()),
]

3.启动 Daphne 以运行该应用:

daphne myproject.asgi:application

通过这些步骤,可以创建一个简单的 WebSocket 实时聊天系统,支持客户端之间的实时消息传递。

实时通知系统

通过 Daphne 的长连接和异步任务支持,还可以实现一个实时通知系统,向用户推送即时消息。例如,当服务器接收到事件(如新消息或状态更新)时,可以通过 WebSocket 向用户推送通知。

class NotificationConsumer(AsyncWebsocketConsumer):async def connect(self):await self.accept()async def notify(self, message):await self.send(text_data=json.dumps({'notification': message}))

这个系统可以用于在线协作工具、社交媒体平台、电子商务站点等场景,实现即时的通知推送功能。

总结

Daphne 是一个轻量级、高效的 Web 服务器,专为运行 ASGI 应用而设计,特别适合现代异步 Web 应用和实时通信系统。它的优势在于对 HTTP 和 WebSocket 的原生支持,并且能够与 Django Channels 无缝集成,帮助开发者构建高性能、实时响应的 Web 应用。通过本文的介绍,已经了解了如何使用 Daphne 运行 ASGI 应用、实现 WebSocket 通信,并在实际项目中应用这些技术。无论是实时聊天系统、通知推送,还是复杂的异步应用,Daphne 都能提供强大的支持。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!


我们还为大家准备了Python资料,感兴趣的小伙伴快来找我领取一起交流学习哦!

1f3ce2745c4f7baffceb5673bcf40364.jpeg

往期推荐

Python基础学习常见的100个问题.pdf(附答案)

Python办公自动化完全指南(免费PDF)

Python Web 开发常见的100个问题.PDF

Beautiful Soup快速上手指南,从入门到精通(PDF下载)

124个Python案例,完整源代码!

80个Python数据分析必备实战案例.pdf(附代码),完全开放下载

120道Python面试题.pdf ,完全版开放下载

全网最全 Pandas的入门与高级教程全集,都在这里了!(PDF下载)

点击下方“阅读原文”查看更多

相关文章:

Python Daphne库:ASGI服务的高效Web服务器

更多Python学习内容:ipengtao.com 随着 Web 开发技术的不断发展,异步编程逐渐成为构建高性能 Web 应用的主流方式。传统的 WSGI 接口已经不能满足现代异步 Web 应用的需求。ASGI(Asynchronous Server Gateway Interface)作为 WSGI…...

如何保护自己电脑以及服务器的ip地址

保护你的电脑和服务器的IP地址,可以采取以下措施: 1. 使用代理服务器 HTTP/HTTPS代理:通过代理服务器访问网络,隐藏真实IP地址。SOCKS代理:提供更高级的网络流量转发,可以更好地处理各种网络协议。 2. 配…...

我的创作纪念日---256days

机缘 1.总结自己的学习过程面遇到的困难的解决方案; 2.总结自己日常学习过程中的知识,以及自己的理解和看法; 3.帮助需要的小伙伴在自己的文章里面找到想要的答案; 4.共同推进CSDN社区建设; 5.让自己每天都去写博…...

前端大模型入门:Transformer.js 和 Xenova-引领浏览器端的机器学习变革

除了调用别人的api接口使用transformer技术,你是否想过将大模型在浏览器中运行呢?尤其是WebGPU的出现,性能比WebGL高不少,很多小任务真的不再需要在一个中心运行了。 不少同学买课学python了,但我还是在坚持用js尝试&a…...

计算机性能指标之MFLOPS

1. MFLOPS的定义与计算方式 定义:MFLOPS,全称Million Floating-point Operations Per Second,即每秒百万次浮点运算,是衡量计算机系统浮点运算能力的一个重要技术指标。 计算方式:MFLOPS的计算公式为“浮点操作次数 /…...

Sharp.js:简单而又实用的图像处理库

前言 在现代Web开发中,图像处理是一个不可或缺的部分。 前端开发者经常需要处理图像,以确保它们在不同的设备和分辨率上都能保持良好的显示效果。 sharp.js是一个高性能的Node.js模块,它利用了libvips库,提供了快速且高效的图像…...

Rust环境安装配置

要加速安装 Rust 和 git-cliff,可以配置国内的镜像源。特别是在国内访问 Rust 官方的安装源时,可能会遇到速度较慢的问题。通过配置 TUNA(清华大学开源软件镜像站)的镜像源,可以大幅提升安装速度。 1. 配置国内镜像加…...

衡石分析平台系统管理手册-功能配置之全局 JS 设置

全局 JS 设置​ 衡石系统提供了全局 JS 设置功能,用户可以通过自定义 JS 代码实现系统的个性化需求,如使用第三方统计工具对系统平台的 PV 、UV 进行监测。 使用场景​ 场景1:增加百度统计​ 下图示例中使用 js 代码引用了百度网站统计功…...

OpenHarmony(鸿蒙南向)——平台驱动开发【MIPI DSI】

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 DSI(Display Serial Interface&#x…...

C++_一篇文章让你弄懂各类(运算符)

运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 内置了丰富的运算符,并提供了以下类型的运算符: 算术运算符关系运算符逻辑运算符位运算符赋值运算符杂项运算符 本章将逐一介绍算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和…...

顺序表算法题 —— 移除元素、删除有序数组中的重复项、合并两个有序数组

目录 一、顺序表算法题 1、移除元素 2、删除有序数组中的重复项 3、 合并两个有序数组 二、顺序表问题与思考 一、顺序表算法题 1、移除元素 移除元素 - 力扣(LeetCode) 思路分析: 思路一:创建一个新数组,开辟…...

配置ssh后又报错git@github.com: Permission denied (publickey)

再添加一次ssh有用 ssh-add ~/.ssh/你的id_rsa的名字可以先运行 eval "$(ssh-agent -s)"再添加,Jesus每次重启terminal都要输入一遍 报错 gitgithub.com: Permission denied (publickey) 通常是由于 SSH 公钥没有正确配置或者 GitHub 上未能识别你的公钥…...

yolov10安装体验

按照官网 conda create -n yolov10 python=3.9 conda activate yolov10 pip install -r requirements.txt pip install -e . 一路安装,运行yolov10的问题,初次接触的同学可以注意。 Set arbitrary_types_allowed=True in the model_config to ignore this error f you got th…...

使用Docker-Compose部署SpringBoot项目的案例

Docker-Compose是Docker官方的一个开源项目,主要用于实现对Docker容器集群的快速编排和管理。该项目由Python编写,通过调用Docker服务提供的API来管理容器。只要所操作的平台支持Docker API,就可以利用Docker-Compose进行编排管理。Docker-Co…...

大话 RCU (read copy update)

还得是看官方文档。kernel/Document/RCU/WhatisRCU.rst. 首先,我们要搞清楚一件事,指针它是一个变量,他在内存上也是占了空间的,然后他里面的值,是你申请的内存块的首地址。文档开篇就讲咱们的基本原理,就…...

vue项目npm run serve 报错,Error: read ECONNRESET at TCP.onStreamRead

背景:vue2的项目,之前npm run serve一直可以正常使用,突然每次启动都会报错了,报错信息如下: node:events:492 throw er; // Unhandled error event ^ Error: read ECONNRESET at TCP.onStreamRead (n…...

十二、MySQL数据类型精讲

文章目录 1. MySQL中的数据类型2. 整数类型2.1 类型介绍2.2 可选属性2.2.1 M2.2.2 UNSIGNED2.2.3 ZEROFILL 2.3 适用场景2.4 如何选择? 3. 浮点类型3.1 类型介绍3.2 数据精度说明3.3 精度误差说明 4. 定点数类型4.1 类型介绍4.2 开发中经验 5. 位类型:BI…...

不同参数对分类精度的影响以及思考

1 问题 探索不同的batch_size对分类精度的影响探索不同的损失函数对分类精度的影响 2 方法 问题一 要知道的是Batch_size的作用:决定了下降的方向。在合理范围内,增大Batch_size的好处: 一是提高了内存利用率以及大矩阵乘法的并行化效率&…...

开源AI智能名片小程序源码:私域电商构建独特竞争力的新机遇

摘要:本文旨在探讨私域电商如何利用开源AI智能名片小程序源码构建独特竞争力。在强调独特性是通向成功的必要条件的基础上,分析开源AI智能名片小程序源码在私域电商发展独特性方面的作用及相关策略。 一、引言 在竞争激烈的商业环境中,让自己…...

从Web2到Web3:探索下一代互联网的无限可能性

互联网经历了从Web1到Web2的重大变革,现在正迈向Web3。Web2通过社交媒体、电子商务和内容平台改变了我们的数字生活,但同时也伴随着中心化平台的垄断和用户数据被广泛控制的问题。而Web3的出现,则试图通过去中心化技术解决这些挑战&#xff0…...

华为云AI开发平台ModelArts

华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

LLM基础1_语言模型如何处理文本

基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

2023赣州旅游投资集团

单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...