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下载)

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

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

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

相关文章

智慧园区建设,构建智能监控和安防体系

智慧园区是指运用先进的信息技术和互联网思维,以提升园区管理和服务水平为目标,通过整合各类资源、优化园区运营,打造智能化、智能、绿色、低碳的现代园区。在智慧园区中,智慧楼宇、智能监控、智慧消防和智慧安防是不可或缺的重要…

项目实战:k8s部署考试系统

一、新建nfs服务器(192.168.1.44) 1.基础配置(IP地址防火墙等) 2.配置时间同步 [rootlocalhost ~]# yum -y install ntpdate.x86_64 [rootlocalhost ~]# ntpdate time2.aliyun.com 27 Sep 10:28:08 ntpdate[1634]: adjust tim…

机器学习-KNN

KNN:K最邻近算法(K-Nearest Neighbor,KNN) 用特征空间中距离待分类对象的最近的K个样例点的类别来预测。 投票法:K 个样例的对数类别。 k1:最近邻分类 k 通常是奇数(因为我们根据这个K数据判断类别,如果…

基于Hive和Hadoop的保险分析系统

本项目是一个基于大数据技术的保险分析系统,旨在为用户提供全面的汽车保险信息和深入的保险价格分析。系统采用 Hadoop 平台进行大规模数据存储和处理,利用 MapReduce 进行数据分析和处理,通过 Sqoop 实现数据的导入导出,以 Spark…

简单顺序计算器

C语言题目:简单顺序计算器,用python代码解。 (笔记模板由python脚本于2024年09月27日 22:58:16创建,本篇笔记适合喜欢python的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖…

相机的内参 外参

相机的内参和外参是计算机视觉和摄影测量中的重要概念。以下是对它们的详细说明: 内参(Intrinsic Parameters) 内参定义了相机的内部特性,主要包括焦距、主点坐标以及畸变系数。内参矩阵 K 形式如下: 外参&#xf…

JS数据类型类型转换

基本数据类型 JS中的数据类型由原始值和对象共同组成,原始值一共有七种原始值: 数值(Number)大整数(BigInt)字符串(String)布尔值(Boolean)空值(Null)未定义(Undefined)符号(Symbol) 数值和大整数 数值(Number):在js中所有的整数和浮点数都是number类型 …

【含文档】基于Springboot+微信小程序 的中心医院用户移动端(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

[C++]栈队列改成模板类

栈、队列都更改成模板类 栈 .hpp #ifndef MY_STACK_H #define MY_STACK_H #include <iostream>using namespace std;template<typename T> class my_stack { private:T *base;//动态栈指针int top;//栈顶元素int size;//栈大小 public:my_stack();//无参构造my_…

【工具类】证书自动续签免费版 正式发布

证书自动续签免费版 正式发布 1.控制台首页2.申请证书2.1.支持自动解析和手动解析两种模式2.2.LB&#xff08;负载均衡&#xff09;支持主流的云厂商2.3.CDN&#xff08;内容分发&#xff09; 支持主流的云厂商2.4.对象存储&#xff08;OSS&#xff09;支持主流云厂商2.5DCDN&a…

Linux云计算 |【第四阶段】RDBMS1-DAY2

主要内容&#xff1a; 常用函数&#xff08;函数分类1&#xff1a;单行、分组&#xff1b;函数分类2&#xff1a;字符、数学、日期、流程控制&#xff09;、分组查询group by、连接查询 一、常用函数 1. 按使用方式分类 ① 单行函数 单行函数&#xff08;Scalar Functions&…

manim页面中不规则分割整个人页面。

界面中的分割方式 在信息设计中&#xff0c;我们常常需要通过分割设计的方式来对信息进行分组&#xff0c;界面中的分割方式大致分为三种&#xff1a;卡片、线条、留白。 界面中的分割方式主要可以分为以下几种&#xff1a; 一、根据规则进行分割&#xff1a; 规则网格分割&…

游戏如何对抗改包

游戏改包是指通过逆向分析手段及修改工具&#xff0c;来篡改游戏包内正常的设定和规则的行为&#xff0c;游戏包被篡改后&#xff0c;会被植入/剔除模块进行重打包。 本期图文我们将通过实际案例分析游戏改包的原理&#xff0c;并分享游戏如何应对改包问题。 安卓平台常见的改…

大数据的挑战是小文件

小文件可能会给存储平台及其支持的应用程序带来大问题。在 Google 上搜索 “small files performance” 会产生 2M 的结果。这篇博文将更深入地研究小文件问题&#xff0c;深入研究其根源并总结解决方案。 问题陈述 出于本讨论的目的&#xff0c;小文件通常被视为小于 64 KB …

蓝桥杯【物联网】零基础到国奖之路:十二. TIM

蓝桥杯【物联网】零基础到国奖之路:十二. TIM 第一节 理论知识第二节 cubemx配置 第一节 理论知识 STM32L071xx器件包括4个通用定时器、1个低功耗定时器&#xff08;LPTIM&#xff09;、2个基本定时器、2个看门狗定时器和SysTick定时器。 通用定时器&#xff08;TIM2、TIM3、…

32 C 语言指针的长度与运算(指针加减整数、指针自增自减、同类型指针相减、指针的比较运算)

目录 1 指针的长度 2 指针与整数的加减运算 3 指针自增与自减 4 同类型指针相减 5 指针的比较运算 6 测试题 1 指针的长度 在 C 语言中&#xff0c;sizeof 运算符可以用来计算指针的长度。指针的长度实际上与指针所指向的数据类型无关&#xff0c;而是与系统的位数&…

怎么通过AI大模型开发一个网站?

目录 一、提示词与AI输出 二、网站效果 以前不会代码开发&#xff0c;写网站是不可能的事情&#xff0c;现在有了AI&#xff0c;一切都有了可能。以下是我通过通义千问大模型开发的简单网站。 一、提示词与AI输出 提示词1 你是python程序员&#xff0c;我有一个大的需求&am…

Charles(青花瓷)抓取https请求

文章目录 前言Charles&#xff08;青花瓷&#xff09;抓取https请求 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&…

QTreeview model过滤

QTreeview model数据过滤&#xff1a;大小写区分&#xff0c;对列过滤&#xff0c;对子对象过滤 示例&#xff1a; 需要自定义QSortFilterProxyModel, //自定义过滤model mProxyModel new TreeFilterProxyModel(this); //添加treeview当前model mProxyModel->setSource…

re轻松拆分四则运算expression(^从头匹配、(?:xxxx)非捕获组、| 交替运算符联合演习)

与ai对抵聊“算式匹配”&#xff0c;发现^从头匹配、(?:xxxx)非捕获组、| “交替”运算符联合使用的妙处。 (笔记模板由python脚本于2024年09月27日 18:35:32创建&#xff0c;本篇笔记适合喜欢python喜欢正则的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;…