python web服务器--WSGI/ASGI协议--web框架,三者之间的关系

news/2025/2/27 0:29:32/文章来源:https://www.cnblogs.com/eastern-sun/p/18740086

在 Python Web 开发中,Web 服务器WSGI/ASGI 协议Web 框架 是三个核心组成部分,它们共同协作以实现完整的 Web 应用程序。以下是三者之间的关系和作用的详细讲解:


1. Web 服务器

Web 服务器是负责接收客户端请求并返回响应的软件或硬件系统。它可以分为以下两类:

  • 独立的 Web 服务器:例如 Nginx、Apache 等,主要用于静态文件的分发和反向代理。
  • 应用服务器:专门用于运行动态应用程序的服务器,例如 Gunicorn(WSGI)、Daphne(ASGI)等。

关键点:

  • 独立的 Web 服务器通常与应用服务器结合使用,以提高性能和安全性。
  • 应用服务器通过 WSGI 或 ASGI 协议与 Web 框架交互。

2. WSGI/ASGI 协议

WSGI(Web Server Gateway Interface)和 ASGI(Asynchronous Server Gateway Interface)是定义 Web 服务器和 Web 框架之间通信的标准协议。

WSGI 的作用

  • WSGI 是一个同步协议,用于处理传统的 HTTP 请求和响应。
  • 它定义了 Web 服务器如何调用 Web 框架中的应用程序。
  • 示例:Gunicorn 是一个常见的 WSGI 服务器(Gunicorn、Nginx/uWSGI),它将 HTTP 请求传递给 Django 或 Flask 等框架。

WSGI 工作流程:

  1. Web 服务器(如 Nginx)接收到客户端请求。
  2. Web 服务器将请求转发给 WSGI 服务器(如 Gunicorn)。
  3. WSGI 服务器通过 WSGI 协议调用 Web 框架中的应用程序。
  4. Web 框架处理请求并生成响应。
  5. 响应通过 WSGI 协议返回给 WSGI 服务器,再由 Web 服务器发送回客户端。

ASGI 的作用

  • ASGI 是 WSGI 的扩展,支持异步操作和多种协议(如 WebSocket、HTTP/2)。
  • 它允许 Web 框架直接处理实时通信需求(如聊天应用、WebSocket 推送等)。
  • 示例:Daphne 是一个常见的 ASGI 服务器,用于运行支持异步的 Django 或 FastAPI 应用程序。

ASGI 工作流程:

  1. Web 服务器(如 Nginx)接收到客户端请求。
  2. Web 服务器将请求转发给 ASGI 服务器(如 Daphne)。
  3. ASGI 服务器通过 ASGI 协议调用 Web 框架中的应用程序。
  4. Web 框架处理请求并生成响应。
  5. 响应通过 ASGI 协议返回给 ASGI 服务器,再由 Web 服务器发送回客户端。

3. Web 框架

Web 框架是开发者用来构建 Web 应用程序的工具包,它封装了许多常用的 Web 功能(如路由、模板渲染、数据库交互等)。

常见 Web 框架

  • Django
    • 默认支持 WSGI,可以通过 wsgi.py 文件与 WSGI 服务器交互。
    • 从 Django 3.0 开始支持 ASGI,可以通过 asgi.py 文件与 ASGI 服务器交互。
  • Flask
    • 主要基于 WSGI,但也可以通过第三方库(如 Quart)支持 ASGI。
  • FastAPI
    • 原生支持 ASGI,推荐使用 Uvicorn 或 Hypercorn 作为 ASGI 服务器。

Web 框架的作用

  • 提供开发接口,让开发者可以专注于业务逻辑。
  • 封装底层细节(如请求解析、响应生成),简化开发过程。
  • 支持与 WSGI/ASGI 协议集成,以便与应用服务器通信。

4. 三者的关系

组件 作用 示例
Web 服务器 接收客户端请求并转发给应用服务器,同时处理静态文件和反向代理 Nginx、Apache
WSGI/ASGI 协议 定义 Web 服务器和 Web 框架之间的通信标准 WSGI(Gunicorn)、ASGI(Daphne)
Web 框架 提供开发接口,封装底层细节,支持与 WSGI/ASGI 集成 Django、Flask、FastAPI

实际部署架构

在生产环境中,三者的典型协作方式如下:

WSGI 架构

客户端 <---> Nginx(反向代理)<---> Gunicorn(WSGI 服务器)<---> Django/Flask(Web 框架)

ASGI 架构

客户端 <---> Nginx(反向代理)<---> Daphne/Uvicorn(ASGI 服务器)<---> Django/FastAPI(Web 框架)

5. 总结

  • Web 服务器 负责接收客户端请求,并将其转发给应用服务器。
  • WSGI/ASGI 协议 定义了 Web 服务器和 Web 框架之间的通信标准。
  • Web 框架 提供开发接口,封装底层细节,并支持与 WSGI/ASGI 集成。

三者相辅相成,共同构成了 Python Web 应用程序的基础架构。选择 WSGI 还是 ASGI 取决于项目的需求(如是否需要 WebSocket 或异步处理)。

AGSI异步和celery异步有什么区别:


1. 什么是 ASGI?

ASGI(Asynchronous Server Gateway Interface)是 WSGI 的扩展,用于支持异步操作和多种协议(如 WebSocket、HTTP/2)。它允许 Python Web 应用程序在单个线程中处理多个并发连接,而不需要为每个连接创建一个新的线程或进程。

  • WSGI 是同步的,适用于传统的 HTTP 请求/响应模型。
  • ASGI 是异步的,支持更复杂的实时通信需求(如 WebSocket 和长轮询)。

2. Daphne 是什么?

Daphne 是一个高性能的 ASGI 服务器,专门设计用来运行支持异步的 Web 应用程序。它的主要特点包括:

  • 支持异步任务处理。
  • 支持多种协议(如 HTTP、WebSocket 等)。
  • 高性能,能够高效地处理大量并发连接。

Daphne 的作用是将客户端请求传递给符合 ASGI 规范的应用程序,并返回应用程序生成的响应。


3. 为什么需要异步?

在传统的 WSGI 模型中,每个请求都会占用一个线程或进程,直到请求完成为止。对于高并发场景(如大量用户同时访问或实时通信),这种模型可能会导致资源耗尽。

而 ASGI 和 Daphne 提供了异步支持,允许应用程序在同一时间处理多个请求,而无需为每个请求分配单独的线程或进程。这使得应用程序能够更高效地处理高并发场景。


4. Celery 和 ASGI 的区别

你提到可以用 Celery 来处理异步任务,这是正确的,但 Celery 和 ASGI 的用途不同:

  • Celery

    • Celery 是一个分布式任务队列系统,主要用于后台执行耗时任务(如发送邮件、处理图片等)。
    • 它与 WSGI 或 ASGI 无关,可以独立运行。
    • Celery 的异步是指任务可以在后台排队并由工作进程异步执行。
  • ASGI

    • ASGI 的异步是指 Web 应用程序本身可以直接处理并发请求,而无需依赖外部工具。
    • 它特别适合需要实时通信的应用场景(如聊天应用、WebSocket 推送等)。

5. 总结:Daphne 的意义

Daphne 是一个高性能的 ASGI 服务器,用于运行支持异步的 Web 应用程序,这句话的意思是:

  • Daphne 能够高效地处理基于 ASGI 的应用程序,这些应用程序可以利用 Python 的异步特性(async/await)来处理高并发请求。
  • 它不仅支持传统的 HTTP 请求,还支持 WebSocket 和其他实时通信协议。

虽然 Celery 可以用来处理异步任务,但它与 ASGI 的异步能力并不冲突。Celery 更适合后台任务处理,而 ASGI 和 Daphne 则更适合实时通信和高并发场景。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《软件开发与创新课程设计》第一次作业:软件二次开发

一、项目名称与来源 该项目名为体育新闻信息查询系统,源码来自同学。 二、目的 项目体育新闻信息查询系统的目的是基于Java和JavaScript创建一个能够查询体育新闻的web系统。本次作业的目的是基于该系统的基础上进行二次开发。 三、部分原代码 1.体育新闻网点击查看代码 <!…

如何更改 debian 系统家目录中文件夹的语言

一、当前家目录文件夹是中文 当时安装系统的时候,选择了中文,导致家目录的文件夹也是中文的。这导致在命令行中会出现中文路径,现在想把它改成英文的。二、改成英文 家目录的 .config 文件夹中有两个文件与此相关,它们分别是: # /home/xxx/.config user-dirs.dirs user-di…

C++ 超市零售系统二次开发

一、来源 本次分析与二次开发的超市零售系统项目名称为 "SimpleSupermarketManagement", 作者是 GitHub 用户 "CodeExplorer1995",项目地址为https://github.com/CodeExplorer1995/SimpleSupermarketManagement。该项目旨在为小型超市提供基础的业务管理…

IOC 和 DI 详解及其简单用法

1. IOC 详解 1.1 Bean 的声明 IOC 控制反转,就是将对象的控制权交给 Spring 的 IOC 容器,由 IOC 容器创建及管理对象。IOC 容器创建的对象称为 bean 对象。 而 Spring 框架为了更好的标识 Web 应用程序开发当中,bean 对象到底归属于哪一层,又提供了 @Component 的衍生注解:…

开源一款DDS信号发生扩展板-FreakStudio多米诺系列

信号发生扩展板通过SPI接口生成可调频率和幅度的正弦波、方波和三角波,频率小于1MHz。支持幅度调节,提供原始和6倍放大输出接口。配备5阶低通滤波器、噪声抑制功能,优化信号稳定性。原文链接: FreakStudio的博客 摘要 信号发生扩展板通过SPI接口生成可调频率和幅度的正弦波…

Windows系统更改/迁移用户目录

Windows系统更改/迁移用户目录Windows系统更改/迁移用户目录 迁移的原因C盘空间不足 不想将我的文档等放在C盘,方便重做系统 其他原因迁移有什么风险么目前没发现有什么风险迁移过程 准备工作 更改/迁移用户目录之前先自行备份当前用户的资料(下载目录、桌面文件等),以免数…

[2025.2.26 JavaWeb学习]登录校验

流程图会话技术指浏览器与服务器的一次连接,直到某一方断开,某个浏览器的一次会话可以包含多次请求和响应会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据

cmcc_simplerop

打开ida查看,可以看到是静态编译,所以无法常规用ret2libc此时可以用最简单的方法系统调用 首先ida上面的偏移量是错误的,我们手动用gdb算一下距离ebp为0x1c因为要实现execve("/bin/sh",0,0)找int 0x80,eax,ebx,ecx,edx因为程序里面没有binsh或sh,所以我们得手动…

day4复健-字符串

题目练习:反转字符串 知识学习: StringBuilder:内容可变的字符串容器StringJoiner练习: 阿拉伯数字转换为罗马数字练习2:练习3:

软件开发与创新——万年历功能新增与代码优化

一、项目名称与来源 上海海洋大学C语言期末大作业 二、原项目运行 运行环境: 系统:Windows11 24H2 cpu:i7-10750H 编译器:Dev c++ 5.11 运行结果:点击查看代码 #include <stdio.h> #include <stdlib.h>// 定义每个月的天数,第一行为平年,第二行为闰年 int d…

逆向软件设计和开发---学生信息管理程序

一、来源 源代码来自同学大一上学期C语言大作业 二、运行环境 Dev-C++ 6.3 三、源代码及运行结果 1.源代码点击查看代码 #include <stdio.h> #include <stdlib.h> #include <string.h>#define MAX_NAME_LENGTH 20 #define MAX_SCORE_COUNT 5// 学生信息结构体…

在鹅厂做java开发是什么体验

离职已有好几个月,准备写一篇关于之前在腾讯做Java开发的经历,现在来谈谈在Java领域里,在腾讯做Java开发的体验。随便写写别较真。首先,介绍一下腾讯里与Java相关的部门。主要有CDG(云与智慧产业事业群)中的腾讯广告和FIT(金融科技事业群)理财通。其他部门则包括TEG中的…