当前位置: 首页 > 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…...

XML Group端口详解

在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里&#xff0c;Bessie 有一个烤箱&#xff0c;可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...

负载均衡器》》LVS、Nginx、HAproxy 区别

虚拟主机 先4&#xff0c;后7...