从前面的内容看来 WSGI 规范通过 Server 接收请求,解析后发给 Application 处理逻辑。但是在 Server 和 Application 中间还有一个 Middleware 中间件的概念。
中间件顾名思义就是处在中间的套件,对于 Server 看来它的行为是一个 Application,对于 Application 看来它的行为是一个 Server。
一、对 Server 而言

对 Server 而言是一个 Application
如上图,Middleware 在 Application 之前接收 Server 的参数并处理,其接受的参数与 Application 一样:
- environ
- start_response
如果处理过程需要提前结束(前置判断没有通过,或者逻辑提前执行完成)就直接返回,否则继续执行下一层中间件或者 Application 的逻辑。
二、对 Application 而言

对 Application 而言是一个 Server
如上图,如果 Middleware 的执行完成,需要执行下一层 Middleware 或者 Application,就将 environ 和 start_response 作为参数调用下一层,对于下一层看来,它的行为与 Server 无异。
Middleware 本身对于前后的概念是透明的,这也意味着在 Server 和 Application 之间可以有多层 Middleware 嵌套,这样的好处在于它可以将逻辑拆分开,使得每一层处理其专业化的过程,同时允许随意修改中间件的调用顺序,甚至编写逻辑实现上层的调用管理,中间件的设计使得这些解决方案能够被灵活地支持。
三、示例
class MiddlewareExample(object):
def __init__(self, app):
self._app = app
def __call__(self, environ, start_response):
if not self._app:
# 某些逻辑情况下走进了这个分支
return ["Advanced return!"]
# 否则继续调用下一个中间件或者应用
return self._app(environ, start_response)
使用这样定义的中间件,最终一个 app 可以像下面这样去组成:
def create_example_app(app):
return MiddlewareExample1(
MiddlewareExample2(
MiddlewareExample3(
MiddlewareExample4(app))))
中间的每层 MiddlewareExample 可以随意调换位置,由此可见中间件将整个过程解耦以后组合一个 app 调用过程变得简单很多,也有了一个框架的样子了。