WSGI是Python Web Server Gateway Interface的缩写,意为Web服务器网关接口,是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。
一、WSGI概念
WSGI的全称是Web Server Gateway Interface,翻译过来就是Web服务器网关接口。具体的来说,WSGI是一个规范,定义了Web服务器如何与Python应用程序进行交互,使得使用Python写的Web应用程序可以和Web服务器对接起来。WSGI一开始是在PEP-0333中定义的,最新版本是在Python的PEP-3333定义的。
二、WSGI协议
WSGI协议主要分为Server(服务器)和Application(应用程序)两部分:
- Server(服务器):Server一般指Web服务器,通过解析HTTP请求并将其转发给WSGI服务端(即Application),然后将WSGI服务端返回的响应发送给客户端(如浏览器)。
- Application(应用程序):接收从WSGI服务器发送的请求,处理请求,并将处理后的响应结果返回给服务器。
其中,Application(应用程序)是一个可调用的对象,通常是一个函数或类的实例,该对象接收两个参数:
- environ:一个字典,包含Web服务器传递给应用程序的CGI变量和其他与请求相关的数据。这些数据可以被应用程序用于判断请求的内容、处理请求,并生成响应。
- start_response:一个回调函数,用于发送HTTP响应头信息。它需要两个参数:HTTP状态码和HTTP响应头信息列表。当应用程序调用start_response时,它会返回一个可迭代的对象,该对象包含了客户端会收到的所有的HTTP响应体内容。
Application(应用程序)的最后一个返回值必须是一个iterable,包含单个或多个bytestring。在Wsgi服务端迭代这个iterable时,获得的结果会作为HTTP响应体的一部分,被发送回Web服务器并最终传输到客户端(如浏览器)。
三、WSGI流程
- 用户(浏览器)发起请求,Web服务器接收HTTP请求,并将解析后的请求转发给WSGI服务端。
- WSGI服务端收到请求后立即调用WSGI应用端的application对象,并将生成的environ与事先定义好的start_response传给该对象。
- application对象会解析environ,根据其中的URI调用应用服务中对应的处理方法。处理完成后,application对象会先调用start_response开启响应,再将应用服务方法的响应内容迭代返回给WSGI服务端。
- 最后,WSGI服务端将响应发送给Web服务器,再由Web服务器返回给用户(浏览器)。
四、支持WSGI的Web应用框架
- BlueBream
- bobo
- Bottle
- CherryPy
- Django
- Flask
- Google App Engine’s webapp2
- Gunicorn
- prestans
- Pylons
- Pyramid
- restlite
- Tornado
- Trac
- TurboGears
- Uliweb
- web.py
- web2py
- weblayer
- Werkzeug
五、WSGI前景
WSGI的前景是可持续的,WSGI协议提供了一个标准接口,以便Python Web应用能够在各种Web服务器上运行。这使得Python Web应用程序的移植性更好并且更易于开发。 这个协议广泛应用于Python Web框架,例如Django,Flask等等。此外,由于Python语言的简洁性、易读性和易学性,越来越多的Python Web开发人员将其用作优选编程语言。因此,WSGI协议未来在Python Web开发领域将继续扮演重要的角色。
另外,WSGI的一些扩展和升级也在逐渐推进中,比如ASGI(异步服务器网关接口)将支持异步Python Web应用程序,提高Web服务器的并发处理能力。因此,WSGI在未来也会与新的技术和需求保持同步,并继续为Python Web开发者提供良好的开发体验。
延伸阅读1:WSGI规范中要求environ包含的下列成员
- wsgi.version:表示WSGI版本,一个元组(1, 0),表示版本1.0
- wsgi.url_scheme:http或者https
- wsgi.input:一个类文件的输入流,application可以通过这个获取HTTP request body
- wsgi.errors:一个输出流,当应用程序出错时,可以将错误信息写入这里
- wsgi.multithread:当application对象可能被多个线程同时调用时,这个值需要为True
- wsgi.multiprocess:当application对象可能被多个进程同时调用时,这个值需要为True
- wsgi.run_once:当server期望application对象在进程的生命周期内只被调用一次时,该值为True