我们都知道Python作为一门强大的语言,能够适应快速原型和较大项目的制作,因此被广泛用于web应用程序的开发中。
在面试的过程中,大家或多或少都被问到过这样一个问题:一个请求从浏览器发出到数据返回都经历过哪些过程?
要回答这个问题,首先你需要对HTTP协议、web框架、服务器等底层知识有一定的储备量,同时需要对web框架和服务器之间的关联有一定的了解,这里有张图上面详细的标明它们之间的联系。
这么多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服务器和PythonWeb应用程序框架之间的标准接口。通过标准化Web服务器和Pythonweb应用程序框架之间的行为和通信,WSGI使得编写可移植的的Pythonweb代码变为可能,使其能够部署在任何符合WSGI的web服务。
有了WSGI协议,我们就不需要为每一个web框架去搞一套协议,因为基本上所有的Pythonweb框架都支持这个协议。
三、uWSGI服务器uWSGI服务器也就是图片中的所指的WSGI容器,独立uWSGI服务器相比传统web服务器,使用更少的资源,并提供最高的性能。Python中的uWSGI服务器应用最广的主要包含以下几个:
GunicornGunicorn(GreenUnicorn,绿色独角兽)是一个纯PythonWSGI服务器,用来支持Python应用。不像其他Pythonweb服务器,它有周全的用户界面,十分易于使用和配置。
Gunicorn具有合理的默认配置。然而,其他一些像uWSGI这样的服务器相较而言过于可定制化,因此更加难以高效使用。
Gunicorn是如今新Pythonweb应用程序的推荐选择。
WaitressWaitress是一个纯PythonWSGI服务器,声称具备“非常高效的性能”。它的文档不是很详细,但它确实提供了一些很好的而Gunicorn没有的功能(例如HTTP请求缓冲)。
Waitress在PythonWeb开发社区中越来越受欢迎。
uWSGI你没有看错,又是uWSGI!uWSGI用来构建全栈式的主机服务。除了进程管理、进程监控和其他功能外,uWSGI也能作为一个应用服务器,适用于多种编程语言和协议-包括Python和WSIG。uWSGI既能当作独立的web路由器来运行,也能运行在一个完整web服务器(比如Nginx或Apache)之后。对于后者,web服务器可以基于uwsgi协议配置uWSGI和应用的操作。uWSGI的web服务器支持允许动态配置Python、传递环境变量等。
四、uwsgi协议uwsgi协议:与WSGI一样是一种通信协议,它是web服务器和uWSGI服务器之间的协议,一个uWSGI服务器的独占协议,它是用于定义传输信息的类型(typeofinformation),每一个uwsgipacket前4byte为传输信息类型的描述,与WSGI协议是两种东西。
五、Web服务器端Web服务器包括Nginx,Apache,IIS等。而优秀的web服务器在接收