WSGI 学习(4)Middleware

从前面的内容看来 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 调用过程变得简单很多,也有了一个框架的样子了。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容