读懂Python 框架和web服务器之间的关系

2019-11-0611:54:02后端程序开发Comments2,363 views字数 2192阅读模式

Python 作为一门强大的语言,能够适应快速原型和较大项目的制作,因此被广泛用于 web 应用程序的开发中。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17365.html

在面试的过程中,大家或多或少都被问到过这样一个问题:一个请求从浏览器发出到数据返回都经历过哪些过程?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17365.html

要回答这个问题,首先你需要对 HTTP 协议、web框架、服务器等底层知识有一定的储备量,同时需要对 web 框架和服务器之间的关联有一定的了解,这里有张图上面详细的标明它们之间的联系。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17365.html

读懂Python 框架和web服务器之间的关系

这么多 wsgi 是不是有点懵逼?看不明白没有关系,下面我会带大家顺着图片里面的顺序一步一步来搞懂里面的概念,厘清它们之间的关系文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17365.html

一、web 框架

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

熟悉的朋友都知道 Web 框架包含一系列库和一个主要的处理器 (handler),这样你就能够构建自己的代码来实现 Web 应用 (比如说一个交互式的网站)。大多数 web 框架包含模式和工具,能实现以下功能:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17365.html

URL 路由

将输入的 HTTP 请求匹配到特定的路由函数,通过路由函数来调用对应的 Python 代码文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17365.html

请求和响应对象

Python 中的大多的 web 框架都帮我们封装好了来自用户发送的 HTTP 请求 Request,同时也提供了发送给用户浏览器的 Response 对象文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17365.html

模板引擎

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

Web 服务开发

除了上述之外,单单一个 web 框架并不能支撑我们应用上的服务,需要在开发机上运行 HTTP 服务器,从而快速开发;这就需要涉及到 web 框架和服务器之间的通信等问题。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17365.html

好在 Python 给我们提供了这样的协议接口,也就是我们常说的 WSGI 协议!下面来了解一下什么是 WSGI 。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17365.html

二、WSGI协议

Web 服务网关接口 (简称为 "WSGI") 是一种在 Web 服务器和 Python Web 应用程序框架之间的标准接口。通过标准化 Web 服务器和 Python web 应用程序框架之间的行为和通信,WSGI 使得编写可移植的的 Python web 代码变为可能,使其能够部署在任何符合 WSGI 的 web 服务。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17365.html

有了 WSGI 协议,我们就不需要为每一个 web 框架去搞一套协议,因为基本上所有的Python web 框架都支持这个协议。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17365.html

三、uWSGI服务器

uWSGI 服务器也就是图片中的所指的 WSGI 容器, 独立 uWSGI 服务器相比传统 web 服务器,使用更少的资源,并提供最高的性能 。Python 中的 uWSGI 服务器应用最广的主要包含以下几个:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17365.html

Gunicorn

Gunicorn (Green Unicorn,绿色独角兽) 是一个纯 Python WSGI 服务器,用来支持 Python 应用。不像其他 Python web 服务器,它有周全的用户界面,十分易于使用和配置。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17365.html

Gunicorn 具有合理的默认配置。然而,其他一些像 uWSGI 这样的服务器相较而言过于可定制化,因此更加难以高效使用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17365.html

Gunicorn 是如今新 Python web 应用程序的推荐选择。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17365.html

Waitress

Waitress 是一个纯 Python WSGI 服务器,声称具备 “非常高效的性能”。它的文档不是很详细,但它确实提供了一些很好的而 Gunicorn 没有的功能(例如 HTTP 请求缓冲)。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17365.html

Waitress 在 Python Web 开发社区中越来越受欢迎。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17365.html

uWSGI

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

四、uwsgi 协议

uwsgi 协议:与 WSGI 一样是一种通信协议,它是 web 服务器 和 uWSGI 服务器之间的协议,一个 uWSGI 服务器的独占协议,它是用于定义传输信息的类型(type of information),每一个 uwsgi packet前4byte为传输信息类型的描述,与 WSGI协议 是两种东西。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17365.html

五、Web 服务器端

Web 服务器包括 Nginx,Apache,IIS 等。而优秀的 web 服务器在接收 http 请求时,还可以做负载均衡和反向代理等工作。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17365.html

Nginx

Nginx 是一个 web 服务器,并且是 HTTP 、SMTP 和其他协议的反向代理。它由其高性能、相对简洁以及对众多应用服务器 (比如 WSGI 服务器) 兼容而著名。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17365.html

它也拥有便利的特性, 比如负载均衡、基本的认证、流等。Nginx 被设计为承载高负载的网站,并逐渐变得广为流行。所以我们一般用 Nginx来做还可以做负载均衡和反向代理!文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17365.html

当然除了厘清以上的概念及它们之间的关系之外,您还需要知道 HTTP 协议的知识,这部分也是在面试中经常被问到的,这里就不做赘述了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17365.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/17365.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定