0%

WSGI学习笔记

本来想写一篇webpy源码分析的,但是WSGI的内容有点多,于是就把WSGI的内容单独拿出来写了。

为什么会出现WSGI

很早期的时候,web服务器并不能运行python应用程序。直到90年代末期,一个叫Grisha Trubetskoy的开发者提出了一个Apache模块mod_python来运行python代码。然而问题是mod_python并不是一个标准,而且也发现了安全问题。这个时候WSGI应运而生。

WSGI是什么

WSGI是Web Server Gateway Interface的简称,是专门为python定制的,我们可以认为它是一个接口,或者标准,我们需要自己实现它。那么具体怎么理解呢?

正如上面这幅图所示,WSGI包括两个部分:Server/Gateway端,Application/Framework端。这两个部分通过一个可调用的对象来交互。

Server/Gateway端

它定义了WSGI application的一些行为以及要求。也就是说它告诉Server端针对application需要提供什么,接口是什么样的,以及出错处理等。

Application/Framework端

对应的,针对application端,它需要知道server端提供了什么样的接口,行为以及出错处理。

中间件

同时实现了server端和application端的object,我们称为中间件。

WSGI的优点

主要体现在下面两个方面:

  1. 灵活性
  2. 扩展性

灵活性体现在由于是server端/application端分离,所以在选择上开发者只需要选择合适的端程序。比如在WSGI server(Green Unicorn、uWSGI、mod_wsgi、CherryPy)切换的时候,applicaiton并不需要重写。扩展性主要是指对于web流量扩展的时候,我们只需要考虑web server端,比如采用Nginx作大流量负载,对于静态资源直接返回,只有有需求的request才传给WSGI server。

WSGI规范

关于WSGI主要包括下面几个部分:

  • environ 变量
  • 可调用者start_response()
  • 缓冲和流
  • Unicode问题
  • 错误处理
  • HTTP 1.1 Expect/Continue机制
  • HTTP其他特性
  • 线程支持

这里就不展开说了,具体内容可以参考PEP 333PEP 3333,333和3333的区别在于3333支持Python 3.x