在pecan中存在一个请求配置文件,定义服务启动程序app和过滤器filter,例如:
[pipeline:main] pipeline = request_id sizelimit api-server [filter:request_id] paste.filter_factory = oslo_middleware:RequestId.factory [filter:sizelimit] paste.filter_factory = oslo_middleware.sizelimit:RequestBodySizeLimiter.factory [app:api-server] paste.app_factory = caesarlinsa.api.app:app_factory
在pipline中定义过滤规则,最后一个为app。如果顺序存在问题,则会报错如下:
定义的过滤器,对request header或者requst_id等参数进行增删校验。在对app处理进行过滤时,需要定义一个filter_app,对请求参数校验。上面定义一个requst_id,在响应头中添加requst id, sizelimit对请求的长度进行校验,过长会抛出异常。但是有一点需要注意,在任何一个过滤器中调用response = req.get_response(self.application),都会获取api访问的响应。
如果每个过滤器中都进行调用,整个流程走下来,会调用好几次api中接口。以下为在每个filter中加入获取响应并打印的过程,过滤器中获取的响应会存在stack中,在调用服务api时检查响应是否存在,如果存在,则不调用服务api,不存在则调用。该例中,在filter中获取两次,在服务api中并未进行调用,直接返回响应。