刚转行互联网行业,听过很多名词:Flask、Django、WSGI、Nginx、Apache等等,但一直搞不清楚关系在这些开源项目之间,直到我读了这篇文章,才觉得豁然开朗。以下为转载部分。感谢haozlee分享这篇文章!一、概述之前,对于Nginx、WSGI(或uWSGI、uwsgi)、Flask(或Django)的关系存疑。查阅了一些资料,终于理清了他们的关系。综上所述,客户端从发送HTTP请求到Flask处理请求,经历了web服务器层、WSGI层、web框架层,这三层。不同的级别有不同的功能。下面简单介绍一下各层的作用。图1:Web服务器、Web框架和WSGI的三层关系二、各层的作用1.Web服务器层对于传统的客户端-服务器架构,请求处理过程是客户端向服务器发送请求,服务器接收到请求并处理请求,然后返回响应给客户端。在这个过程中,服务器的作用是:(1)、接收请求(2)、处理请求(3)、返回响应Web服务器是一种特殊类型的服务器,它的作用主要是接收HTTP请求和返回响应。每个人都熟悉Web服务器。常见的Web服务器有Nginx、Apache、IIS等。在上图1的三层结构中,Web服务器最先接收用户请求,并将响应结果返回给用户。2、Web框架层Web框架的作用主要是方便我们开发Web应用,HTTP请求的动态数据由Web框架层提供。常见的web框架有Flask、Django等,我们以Flask框架为例,展示web框架的作用:fromflaskimportFlaskapp=Flask(__name__)@app.route('/hello')defhello_world():返回'HelloWorld!'if__name__=='__main__':app.run(host='0.0.0.0',port=8080)上面简单的几行代码创建了一个web应用对象app。App监听本机所有IP的8080端口,接受用户的连接请求。我们知道HTTP协议是通过URL来定位资源的,上面的程序会将对路径/hello的请求交给hello_world方法,hello_world返回'HelloWorld!'细绳。对于Web框架的用户来说,他们并不关心如何接收HTTP请求,也不关心如何将请求路由到具体的方法进行处理,并将响应结果返回给用户。在大多数情况下,Web框架的用户只需要关心如何实现业务逻辑。3、WSGI层WSGI不是服务器,也不是与程序交互的API,更不是真正的代码。WSGI只是一个接口,只适用于Python语言。它的全称是WebServerGatewayInterface,定义了Web服务器和Web应用程序之间的接口规范。也就是说,只要web服务器和web应用遵守WSGI协议,那么web服务器和web应用就可以自由组合。下面的代码显示了Web服务器如何与Web应用程序相结合。defapplication(env,start_response):start_response('200OK',[('Content-Type','text/html')])return[b"HelloWorld"]方法application被web服务器调用,参数env,start_response由网络服务器实现并传入。其中,env是一个字典,包含HTTP_HOST、HOST_USER_AGENT、SERVER_PROTOCO等环境变量。start_response是一个方法,它接受status和response_headers两个参数。application方法的主要功能是设置http响应的状态码、Content-Type等头信息,并返回响应的具体结果。上面的代码就是一个完整的WSGI应用。当启用WSGI的Web服务器收到来自客户端的请求时,它将调用应用程序方法。WSGI层不需要关心env和start_response这两个变量是如何实现的,就像在应用程序中做的一样,直接使用这两个变量即可。值得指出的是,WSGI是一个协议,需要区分几个类似的名词:(1)、uwsgi和wsgi一样也是一个协议,uWSGI服务器使用uwsgi协议(2)、uWSGI实现uwsgi和WSGIWeb两种协议的服务器。需要注意的是,uWSGI本质上也是一个Web服务器,也就是上述三层结构中的Web服务器层。(3)、CGI通用网关接口,不局限于Python语言,定义了web服务器如何向客户端提供动态内容。例如,它指定了客户端如何将参数传递给Web服务器,Web服务器如何将参数传递给Web应用程序,Web应用程序如何将其输出发送给客户端,等等。生产环境中的Web应用程序不再使用CGI。每次请求都会创建一个CGI进程(类似于Python解释器),用完就丢弃,效率低下。创建WSGI是为了取代CGI。说到这里,我们已经基本明确了WSGI在Web服务器和Web框架之间的作用:WSGI就像一根纽带,连接着Web服务器和Web框架。回到本文的主题,Nginx是一种web服务器,Flask是一种web框架。因此,WSGI、Nginx和Flask的作用不言而喻。3.结语最后,本文以Nginx、WSGI、Flask的对话结束。Nginx:嘿,WSGI,我刚刚收到一个请求,我需要你准备一下,然后Flask会处理这个请求。WSGI:好的,Nginx。我将设置环境变量并将请求传递给Flask进行处理。Flask:感谢WSGI!请给我一些时间,我会回复您对请求的回复。WSGI:好的,那我等你。Flask:好了,我说完了,这里是请求的响应结果,请求将结果传递给Nginx。WSGI:干得好!Nginx,这里是响应结果,已经按要求回传给你了。Nginx:酷,我收到了,我把响应结果返回给了客户端。大家合作愉快~4.参考资料(1),http://hackerxu.com/2015/05/1...(2),https://www.quora.com/What-ar...(3),https://en.wikipedia.org/wiki...(4),http://flask.pocoo.org/docs/0...(5),http://stackoverflow.com/ques。..(6),https://www.python.org/dev/pe...(7),《Python核心编程(第3版)》WesleyChun
