WSGI Application 是网关接口的实际执行逻辑层,对于 Server 看来,它提供的是一个可以传入两个参数的接口,这两个参数即前面提到的:
- environ
- start_response
在实际接口逻辑里面,思路通常是根据 environ 里面的数据处理逻辑,改变 application 中对应功能的状态,然后调用 start_response 返回头信息,并在返回值返回响应体。
一、简单的 Application 例子
下面是一个简单的 Application:
def app(environ, start_response):
status = '200 OK'
response_headers = [('Content-type', 'text/html')]
start_response(status, response_headers)
return ['Simple Application']
首先通过 start_response 将响应状态和响应头返回,然后 Server 再将下面返回的 list 里面的每一个消息写入响应体。
这样写的好处在于将 Application 产生响应头和响应体数据的逻辑与实际执行逻辑解耦,由 Server 负责解析和包装请求信息和响应信息,Application 只负责具体执行并返回执行结果,从客户端角度看返回的就是请求的响应。
再加上 Middleware 中间件对 Application 的逻辑解耦,WSGI 规范的逻辑执行部分会更灵活,也更方便复用。
二、关于可调用对象
另外因为 application 只要是一个可调用对象即可,也就意味着只要实现了 __call__ 方法,该对象就可以作为 Server 可调用的应用接口。
因此,上面的函数可以写成下面这种形式:
class app(object):
def __call__(self, environ, start_response):
status = '200 OK'
response_headers = [('Content-type', 'text/html')]
start_response(status, response_headers)
return ['Simple Application']
这样写即为可调用对象,使用类来实现还有一个好处在于 Application 可以保存本次调用的状态,比如统计访问次数等功能就可以使用类来实现,将状态和逻辑包装起来。