一文读懂Python web框架和web服务器之间的关系-程序员宅基地

640?wx_fmt=jpeg

我们都知道 Python 作为一门强大的语言,能够适应快速原型和较大项目的制作,因此被广泛用于 web 应用程序的开发中。

在面试的过程中,大家或多或少都被问到过这样一个问题:一个请求从浏览器发出到数据返回都经历过哪些过程?

要回答这个问题,首先你需要对 HTTP 协议、web框架、服务器等底层知识有一定的储备量,同时需要对 web 框架和服务器之间的关联有一定的了解,这里有张图上面详细的标明它们之间的联系。

640?wx_fmt=png

这么多 wsgi 是不是有点懵逼?看不明白没有关系,下面我会带大家顺着图片里面的顺序一步一步来搞懂里面的概念,厘清它们之间的关系

一、web 框架

在 Python 有很多 web 框架,其中常见的像 Django、Flask、Tornado 、sanic 等,可能有些人对 sanic 不是很熟悉,这里简单说几句,它的用法和 Flask 很相似,但是它支持 async/await 异步并发编程,所以相对来说性能更高。这里就不对这些框架作比较了,因为这不是我们今天的重点!

熟悉的朋友都知道 Web 框架包含一系列库和一个主要的处理器 (handler),这样你就能够构建自己的代码来实现 Web 应用 (比如说一个交互式的网站)。大多数 web 框架包含模式和工具,能实现以下功能:

URL 路由

将输入的 HTTP 请求匹配到特定的路由函数,通过路由函数来调用对应的 Python 代码

请求和响应对象

Python 中的大多的 web 框架都帮我们封装好了来自用户发送的 HTTP 请求 Request,同时也提供了发送给用户浏览器的 Response 对象

模板引擎

能够将实现应用的 Python 代码逻辑和其要产生输出的 HTML (或其他的) 分离开,例如比较知名的 Jinja2 模板引擎。它使用基于文本的模板语言,因此可以用来生成任何类型的标记,而不仅仅是 HTML。它允许定制过滤器、标签、测试和全局变量

Web 服务开发

除了上述之外,单单一个 web 框架并不能支撑我们应用上的服务,需要在开发机上运行 HTTP 服务器,从而快速开发;这就需要涉及到 web 框架和服务器之间的通信等问题。

好在 Python 给我们提供了这样的协议接口,也就是我们常说的 WSGI 协议!下面来了解一下什么是 WSGI 。

二、WSGI协议

Web 服务网关接口 (简称为 "WSGI") 是一种在 Web 服务器和 Python Web 应用程序框架之间的标准接口。通过标准化 Web 服务器和 Python web 应用程序框架之间的行为和通信,WSGI 使得编写可移植的的 Python web 代码变为可能,使其能够部署在任何符合 WSGI 的 web 服务。

有了 WSGI 协议,我们就不需要为每一个 web 框架去搞一套协议,因为基本上所有的Python web 框架都支持这个协议。

三、uWSGI服务器

uWSGI 服务器也就是图片中的所指的 WSGI 容器, 独立 uWSGI 服务器相比传统 web 服务器,使用更少的资源,并提供最高的性能 。Python 中的 uWSGI 服务器应用最广的主要包含以下几个:

Gunicorn

Gunicorn (Green Unicorn,绿色独角兽) 是一个纯 Python WSGI 服务器,用来支持 Python 应用。不像其他 Python web 服务器,它有周全的用户界面,十分易于使用和配置。

Gunicorn 具有合理的默认配置。然而,其他一些像 uWSGI 这样的服务器相较而言过于可定制化,因此更加难以高效使用。

Gunicorn 是如今新 Python web 应用程序的推荐选择。

Waitress

Waitress 是一个纯 Python WSGI 服务器,声称具备 “非常高效的性能”。它的文档不是很详细,但它确实提供了一些很好的而 Gunicorn 没有的功能(例如 HTTP 请求缓冲)。

Waitress 在 Python Web 开发社区中越来越受欢迎。

uWSGI

你没有看错,又是 uWSGI!uWSGI 用来构建全栈式的主机服务。除了进程管理、进程监控和其他功能外, uWSGI 也能作为一个应用服务器,适用于多种编程语言和协议 - 包括 Python 和 WSIG。uWSGI 既能当作独立的 web 路由器来运行,也能运行在一个完整 web 服务器(比如 Nginx 或 Apache )之后。对于后者,web 服务器可以基于 uwsgi 协议 配置 uWSGI 和应用的操作。uWSGI 的 web 服务器支持允许动态配置 Python 、传递环境变量等。

四、uwsgi 协议

uwsgi 协议:与 WSGI 一样是一种通信协议,它是 web 服务器 和 uWSGI 服务器之间的协议,一个 uWSGI 服务器的独占协议,它是用于定义传输信息的类型(type of information),每一个 uwsgi packet前4byte为传输信息类型的描述,与 WSGI协议 是两种东西。

五、Web 服务器端

Web 服务器包括 Nginx,Apache,IIS 等。而优秀的 web 服务器在接收 http 请求时,还可以做负载均衡和反向代理等工作。

Nginx

Nginx 是一个 web 服务器,并且是 HTTP 、SMTP 和其他协议的反向代理。它由其高性能、相对简洁以及对众多应用服务器 (比如 WSGI 服务器) 兼容而著名。

它也拥有便利的特性, 比如负载均衡、基本的认证、流等。Nginx 被设计为承载高负载的网站,并逐渐变得广为流行。所以我们一般用 Nginx来做还可以做负载均衡和反向代理!

当然除了厘清以上的概念及它们之间的关系之外,您还需要知道 HTTP 协议的知识,这部分也是在面试中经常被问到的,这里就不做赘述了。

往期热门,好玩有趣:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cainiao_python/article/details/102950215

智能推荐

javax.imageio.IIOException: Not a JPEG file: starts with 0x47 0x49-程序员宅基地

文章浏览阅读7.8k次。java处理图片时出现异常javax.imageio.IIOException: Not a JPEG file: starts with 0x47 0x49at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImageHeader(Native Method)at com.sun.imageio.plugins.jpeg.JPEGI_javax.imageio.iioexception: not a jpeg file: starts with 0x52 0x49

代发外链哪家好?-程序员宅基地

文章浏览阅读343次,点赞11次,收藏6次。与其授人以鱼不如授人以渔,在这里说说如何选择好的外链商,可以先找一下你要发的这家外链商的口碑,了解其专业水平,这倒是最基本的了,说到底这些东西说得难听点都是可以伪造的,所以最重要的,是要了解外链的作用。外链可以说是网站外部优化最重要的组成部分,一个网站的外链建设对于网站网站优化是至关重要的,选择到一家好的外链商可以说成功了一半,毕竟不是谁都有外链资源。外链最重要的作用毫无疑问,就是提升网站的关键词排名,不能提升排名的外链可以说没有意义,有人就会说了,但外链的作用不是日积月累的吗?

使用Apache的ab工具进行压力测试_用apache中的ab测试接口压力中的时延是什么-程序员宅基地

文章浏览阅读442次。ab命令原理 Apache的ab命令模拟多线程并发请求,测试服务器负载压力,也可以测试nginx、lighthttp、IIS等其它Web服务器的压力。 Apache附带的ab工具(使用的PHP环境是WAMP集成环境,ab工具位于D:\wamp\bin\apache\Apache2.2.21\bin)非常容易使用。ab命令对发出负载的计算机要求很低,既不会占用很多CPU,也不会占用太多的内存,但_用apache中的ab测试接口压力中的时延是什么

falsk框架中安装flask-mysqldb报错解决方案_flask_mysqldb安装失败windows-程序员宅基地

文章浏览阅读1k次。我的是py37版本,无法直接安装flask-mysqldb。下载完成之后直接在控制台本地安装。下载mysqlclient。_flask_mysqldb安装失败windows

手把手教你启用Win10的Linux子系统(超详细)_win10自带linux子系统怎么用-程序员宅基地

文章浏览阅读10w+次,点赞143次,收藏775次。今天为大家介绍如何才能启用Windows10下的Linux子系统,废话不多说,直接看步骤:启用开发者模式打开设置 点击更新和安全 点击开发者选项 启用开发人员模式 更改系统功能使用win+X快捷键调出系统管理菜单后点击应用和功能,然后拉到底下,选择程序和功能 选中应用或关闭Windows功能 勾选适用于Linux的Windows子系统,然后确认并重启..._win10自带linux子系统怎么用

SCI必备Latex编写工具(texlive+texstudio的安装及使用---超详细)-程序员宅基地

文章浏览阅读1.9w次,点赞46次,收藏113次。前言满纸荒唐言,一把辛酸泪。都云作者痴,谁解其中味?只有我的电脑知道为了安装Latex排版的工具花了多少功夫,查了多少资料。斗争之旅我的电脑上很早就有老师给的CTEX安装包,并且安装的时候还是百度了一下安装步骤,生怕到时候会有问题。结果等到我要开始写SCI论文的时候才发现,咦? 这是啥错误undefined control sequence\begin{document},改了路径啥的好多操作都不行,于是卸载,结果发现卸载都卸载不掉,文件都删除不了,后面我慢慢删也是删完了,后面还发现居然还修改_texlive

随便推点

超文本标记语言_head表示超文本文件头信息的结束-程序员宅基地

文章浏览阅读6.2k次。超文本标记语言百科名片超文本标记语言,即HTML(Hypertext Markup Language),是用于描述网页文档的一种标记语言。 查看精彩图册目录基本介绍由来定义语言特点编辑发展历史超文本标记语言可扩展超文本标记语言整体结构文件头部内容文件主体内容字符集_head表示超文本文件头信息的结束

h265硬解码和软解码_h265能通过gpu解码-程序员宅基地

文章浏览阅读2k次。h.265解码库,支持GPU和CPU1.初始化PlayerSDK_Init(CallBack callBackFunc,int nType);callBackFunc 回调函数nType 视频解码方式 CPU解码或者GPU解码2.播放接口PlayerSDK_Play(char* URL, long hWnd, int nType);URL 播放地址hWnd 播放句柄nType 播放类型接口返回播放句柄号3.停止播放接口Play_h265能通过gpu解码

stable diffusion(1): webui的本地部署(windows)_sd webui torch版本-程序员宅基地

文章浏览阅读2.1k次。有一个坑一直没过去,就是如果整体环境没完全装好,但是使用我自己提前创建的python虚拟环境来启动SD启动脚本stable-diffusion-webui/webui-user.bat,期间会因为某些原因(比如没梯子东西下载不下来)启动失败,但是第二次启动时就会报没有pip模块的错误,我就只能重新创建python虚拟环境,再装一遍包,这个过程很漫长很浪费时间,所以一定跟着我的脚步,一步不要落下的走,心急吃不了热豆腐。如果没有梯子,这里很慢或者根本过不去,所以参考。三、修改url地址(梯子强可不改)_sd webui torch版本

CTFSHOW做题记录_ctfshow 龙猫-程序员宅基地

文章浏览阅读491次。CTFSHOW做题记录**CTFSHOW做题记录1**(菜菜的我要写日记啦,欢迎大佬指导)**密码学签到1给出“}wohs.ftc{galf”并且提示倒叙。**解题思路:没看提示的时候乍一看以为是栅栏密码,还想着用在线解密去做,但是定睛一看不对劲,再看题目原来就是倒叙。只需要反着来就好啦。**答案:flag{ctf.show}**今天也是元气满满的一天,好好学习。..._ctfshow 龙猫

抓取动态网页的数据的具体操作方法_动态加载的网页怎么获取链接-程序员宅基地

文章浏览阅读1.9k次。不同的方法适用于不同的情况,例如如果目标网站使用的是JavaScript动态加载数据,那么使用Scrapy-Splash可能会更加适合。如果目标网站的数据比较简单,那么使用浏览器开发者工具可能会更加方便。如果需要模拟用户的操作,那么使用Selenium可能是更好的选择。总之,需要根据具体情况选择合适的方法,才能高效地获取动态网页的数据。综上所述,选择合适的方法取决于具体的需求。如果需要模拟用户的操作,可以使用Selenium。动态网页是指在用户交互过程中,网页内容不断更新和变化的网页。_动态加载的网页怎么获取链接

Ubuntu20.04安装向日葵_ubuntu20.04 安装向日库-程序员宅基地

文章浏览阅读1k次,点赞3次,收藏6次。下载最新版本:https://sunlogin.oray.com/download/缺少部分依赖,手动下载:# 你知道最新的版本号了sudo wget http://download.oray.com/sunlogin/linux/SunloginClient-10.0.2.24779_amd64.debsudo wget http://mirrors.aliyun.com/ubuntu/pool/main/i/icu/libicu60_60.2-3ubuntu3_amd64.debsudo w_ubuntu20.04 安装向日库