跬步 On Coding

WSGI 理解

参考

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等等中间过程。