本来想写一篇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的优点
主要体现在下面两个方面:
- 灵活性
- 扩展性
灵活性体现在由于是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 333和PEP 3333,333和3333的区别在于3333支持Python 3.x