WSGI 理解
Sep 21 2014参考
WSGI 简介
WSGI是Python webserver与Web App之间的协议。这个协议定义了Web server和App的行为,是的server与app分离,简化了开发。
WSGI server,Gunicorn(python实现),uWSGI(C实现),这些服务器程序都实现了标准的WSGI接口,任意web app都可以使用不同的server。
WSGI app,大部分python web framwork的实现最终返回的都是一个WSGI app给WSGI server调用,框架主要实现的就是url路由,cookie处理等等中间件。
WSGI协议中还有一个middleware(中间件),中间件对于server与app都是透明的,即对与app middleware是server,对server middelware是app。middleware可用叠加,实现不同的功能。
应用程序
一个WSGI app看起来应该是这样的:
def application(environ, start_response):
status = '200 OK'
headers = [('Content-Type', 'text/html')]
start_response(status, headers)
return ['Hello world!']
根据WSGI,app必须是一个callable对象,可以是函数,类,实现了__call__
方法的实例对象。
WSGI app接受2个参数environ和start_response,environ是一个包含了CGI环境变量与WSGI相关变量的字典, start_response是一个函数对象,用于处理response header,接受2个参数status是response状态码,headers是response header的列表,列表项是元组。
app返回一个可迭代对象,可以是list,实现了__iter__
方法的类,其它的可迭代对象。用于response body。另外start_response函数调用会返回一个write方法,也可以写入response body,但是不推荐使用,这个write方法只用为了兼容以前的框架保留的。
environ
- REQUEST_METHOD
- PATH_INFO
- QUERY_STRING
CONTENT_TYPE
wsgi.input
以上是主要用到的environ变量,其它请参考参考文章,包含了CGI环境变量,wsgi.input是request body。
start_response
start_response(status, response_headers, exc_info=None)
只用在exc_info不为None时start_response才能调用多次。
middleware
middleware先作为app被server调用,获取environ信息,可用匹配URL调用对应的不同的app,或者处理header中的cookie等等中间过程。