lxian's Blog

简单总结pep333

应用端

提供一个callable 的object. 它应当接受两个参数environ, start_response。并将response body 以一个iterable object 的形式return。

  1. environ
    包含当前request的各种参数
  2. start_reponse
    一个callable object, 接受statusresponse_headersexc_info.
    exc_info 是应用将错误传递给网关端用的。
    start_response 作用是写reponse header,所以需在retrun之前调用
  3. return - iterable response body
    服务器端会读完它并将其写入response

服务器端

每次request 调用应用端端callable 并传入相应的参数。在应用端调用start_response之后,写header,并在应用端返回后,发送header和body

中间件

对应用端看来它是服务器端,服务器端看来它是应用端。也就是说它需要同时实现应用端和服务器端。
所以它需要

  1. 能接收一个应用端程序,并实现自己的start_response,将服务器端的start_response封装进去
  2. callable 并能接收接收environ, start_response
  3. 在服务器端调用自己的时候,调用应用程序,并且传入自己的start_response

由上面可以看出,中间件可以在两个地方实现自己的功能

  1. 在被服务器端调用的时候,可以改写environ
  2. 在自己封装的start_response 中,可以改写从应用端得到的status, response_headers
  3. 在应用端返回之后,可以改写应用端返回的reponse body