WSGI初探

wsgi的基本概念
WSGI comes into picture because the Web Server needs to communicate with the Web Application. WSGI specifies the rules which needs to be implemented by the Web Application side and the Web Server side so that they can interact with each other
 
上面的英文定义,阐述了WSGI的基本概念。WSGI的主要目的是为了解决web server和web application的通信问题。它指定了web server和web application的通信标准,使得两者可以正常通信。
 
WSGI的历史背景
wsgi源于CGI(Common Gateway Interface), CGI描述了服务器和web客户端的通信接口。
CGI的出现主要是为了解决动态网页的问题。
CGI的工作方式,从Web服务器的角度看,是在特定的位置定义了可以运行CGI程序。当收到一个匹配URL的请求,相应的程序就会被调用,并将客户端发送的数据作为输入。程序的输出会由Web服务器收集,并加上合适的档头,再发送回客户端。
一般每次的CGI请求都需要新生成一个程序的副本来运行,这样大的工作量会很快将服务器压垮,因此一些更有效的技术像mod_perl,可以让脚本解释器直接作为模块集成在Web服务器(例如:Apache)中,这样就能避免重复加载和初始化解释器。不过这只是就那些需要解释器的高级语言(即解释语言)而言的,使用诸如C一类的编译语言则可以避免这种额外负荷。由于C及其他编译语言的程序与解释语言程序相比,前者的运行速度更快、对操作系统的负荷更小,使用编译语言程序是可能达到更高执行效率的,然而因为开发效率等原因,在当前解释型语言还是最合适的。
 
有了CGI之后python语言没有相对应的标准, 使用了什么样的python web框架,它所适应的web 服务器可能不同。引用PEP 333
 
Python currently boasts a wide variety of web application frameworks, such as Zope, Quixote, Webware, SkunkWeb, PSO, and Twisted Web -- to name just a few. This wide variety of choices can be a problem for new Python users, because generally speaking, their choice of web framework will limit their choice of usable web servers, and vice versa... By contrast, although Java has just as many web application frameworks available, Java's "servlet" API makes it possible for applications written with any Java web application framework to run in any web server that supports the servlet API.
因此产生了wsgi框架。
 
 WSGI原理
浏览器在请求数据的时候,首先要发送一个http请求,请求体有具体的格式,包括方法,消息头等数据。
这个请求体是由浏览器生成发送给服务器端的,服务器需要解析这些请求,并返回数据,返回格式如下:
 
生成这些数据并进行处理返回消息是一个复杂的过程,常见的apche,nginx都可以帮助我们做这些事情,因此,在进行nginx配置的时候可以将html等静态资源直接放在对应的html文件就可以了,但是有些网页是动态生成的,无法借助于nginx等服务器做这样的处理。需要我们来写程序处理这些逻辑。那么web服务器如何和应用程序进行交互,应用程序如何返回数据,需要一套标准。这套标准就是WSGI。
 
Web server 和web application之前是有鸿沟的,必须有一个桥梁来连接web server 和web application。Web application使用的socket编程,根据http协议的交互,相比于socket编程复杂的多,或者说依据http协议的交互是基于socket编程,而服务器之间的交互肯定是基于http协议的交互。如何实现接受request,对request的信息进行封装,又如何返回这些数据,这些业务逻辑需要交给wsgi来做,应用程序只需要按照wsgi标准来编写程序即可。
 
下面看一个wsgi的例子,例子里使用了wsgi的基础库wsgiref。这个库可以用作测试。
 
def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return '<h1>Hello, web!</h1>’


from wsgiref.simple_server import make_server
# 导入我们自己编写的application函数:
from hello import application

# 创建一个服务器,IP地址为空,端口是8000,处理函数是application:
httpd = make_server('', 8000, application)
print "Serving HTTP on port 8000..."
# 开始监听HTTP请求:
httpd.serve_forever()
我们可以查看一下wsgiref的源代码,看看内部是如何实现的,当然里面还有比较复杂的
继承关系和处理逻辑,详细的可以查看下面的链接。
Wsgi库核心包含两个部分内容,一个是启动server,一个是调用application来处理请求,
并返回相应的数据,我们在进行处理的时候只需要按照wsgi标准进行调用即可。
 
 
 
 
posted @ 2019-11-19 10:03  周围静地出奇  阅读(191)  评论(0编辑  收藏  举报