对于传统的客户端-服务器架构,其请求的处理过程是,客户端向服务器发送请求,服务器接收请求并处理请求,然后给客户端返回响应。在这个过程中,服务器的作用是:
接收请求
处理请求
返回响应
Web服务器是一类特殊的服务器,其作用是主要是接收 HTTP 请求并返回响应。提起 web服务器大家都不会陌生,常见的 web服务器有 Nginx,Apache,IIS等。在上图1的三层结构中,web服务器是最先接收用户请求的,并将响应结果返回给用户。
Web框架的作用主要是方便我们开发 web应用程序,HTTP请求的动态数据就是由 web框架层来提供的。常见的 web框架有Flask,Django等,我们以 Flask 框架为例子,展示 web框架的作用。
以上简单的几行代码,就创建了一个web应用程序对象app。app**机器所有ip的8080端口,接受用户的请求连接。我们知道,HTTP协议使用URL来定位资源,上面的程序会将路径/hello的请求交由hello_world方法处理,hello_world 返回‘Hello World!’字符串。对于web框架的使用者来说,他们并不关心如何接收HTTP请求,也不关心如何将请求路由到具体方法处理并将响应结果返回给用户。Web框架的使用者在大部分情况下,只需要关心如何实现业务的逻辑即可。
WSGI不是服务器,也不是用于与程序交互的API,更不是真实的代码,WSGI只是一种接口,它只适用于Python 语言,其全称为Web Server Gateway Interface,定义了web服务器和web应用之间的接口规范。也就是说,只要web服务器和web应用都遵守WSGI协议,那么web服务器和web应用就可以随意的组合。
下面的代码展示了web服务器是如何与web应用组合在一起的,方法application由web服务器调用,参数env,start_response由web服务器实现并传入。其中,env是一个字典,包含了类似HTTPHOST,HOSTUSERAGENT,SERVERPROTOCO等环境变量。start_response则是一个方法,该方法接受两个参数,分别是status,response_headers。application方法的主要作用是,设置http响应的状态码和Content-Type等头部信息,并返回响应的具体结果。
上述代码就是一个完整的WSGI 应用,当一个支持WSGI的web服务器接收到客户端的请求后,便会调用这个application方法。WSGI层并不需要关心env,start_response这两个变量是如何实现的,就像在application里面所做的,直接使用这两个变量即可。
值得指出的是,WSGI 是一种协议,需要区分几个相近的名词:
uwsgi:同wsgi一样也是一种协议,uWSGI服务器正是使用了uwsgi协议
uWSGI:实现了uwsgi和WSGI两种协议的web服务器。注意uWSGI本质上也是一种web服务器,处于上面描述的三层结构中的web服务器层。
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的作用就不明而喻了。
武汉网站制作www.zhandodo.com
免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考;文章版权归原作者所有!本站作为信息内容发布平台,页面展示内容的目的在于传播更多信息;本站不提供任何相关服务,阁下应知本站所提供的内容不能做为操作依据。市场有风险,投资需谨慎!如本文内容影响到您的合法权益(含文章中内容、图片等),请及时联系本站,我们会及时删除处理。