目录

WSGI到底是什么

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(应用程序)两部分:

  1. Server(服务器):Server一般指Web服务器,通过解析HTTP请求并将其转发给WSGI服务端(即Application),然后将WSGI服务端返回的响应发送给客户端(如浏览器)。
  2. Application(应用程序):接收从WSGI服务器发送的请求,处理请求,并将处理后的响应结果返回给服务器。

其中,Application(应用程序)是一个可调用的对象,通常是一个函数或类的实例,该对象接收两个参数:

  1. environ:一个字典,包含Web服务器传递给应用程序的CGI变量和其他与请求相关的数据。这些数据可以被应用程序用于判断请求的内容、处理请求,并生成响应。
  2. start_response:一个回调函数,用于发送HTTP响应头信息。它需要两个参数:HTTP状态码和HTTP响应头信息列表。当应用程序调用start_response时,它会返回一个可迭代的对象,该对象包含了客户端会收到的所有的HTTP响应体内容。

Application(应用程序)的最后一个返回值必须是一个iterable,包含单个或多个bytestring。在Wsgi服务端迭代这个iterable时,获得的结果会作为HTTP响应体的一部分,被发送回Web服务器并最终传输到客户端(如浏览器)。

三、WSGI流程

  1. 用户(浏览器)发起请求,Web服务器接收HTTP请求,并将解析后的请求转发给WSGI服务端。
  2. WSGI服务端收到请求后立即调用WSGI应用端的application对象,并将生成的environ与事先定义好的start_response传给该对象。
  3. application对象会解析environ,根据其中的URI调用应用服务中对应的处理方法。处理完成后,application对象会先调用start_response开启响应,再将应用服务方法的响应内容迭代返回给WSGI服务端。
  4. 最后,WSGI服务端将响应发送给Web服务器,再由Web服务器返回给用户(浏览器)。

四、支持WSGI的Web应用框架

  1. BlueBream
  2. bobo
  3. Bottle
  4. CherryPy
  5. Django
  6. Flask
  7. Google App Engine’s webapp2
  8. Gunicorn
  9. prestans
  10. Pylons
  11. Pyramid
  12. restlite
  13. Tornado
  14. Trac
  15. TurboGears
  16. Uliweb
  17. web.py
  18. web2py
  19. weblayer
  20. 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