oslo.middleware库可以添加在WSGI pipeline用来拦截request/response请求。其基类可以为WSGI增强功能,如添加、删除、修改HTTP头部信息,支持限制大小和连接数等。本文主要分析Oslo组件如何使用oslo.middleware来实现这些功能。
1. oslo.middleware中的主要pipeline
oslo.middleware中定义了多个WSGI的pipeline,如cors、request_id等。所以,本文首先总结了oslo.middleware中常用的pipeline的实现、作用以及使用场景。在oslo.middleware中,所有的pipeline的实现类都继承自一个父类ConfigurableMiddleware,其是一个基本的WSGI middleware装饰器。该类在实例化时会绑定一个WSGI应用对象APP,则该ConfigurableMiddleware对象在实际使用中便会对绑定的WSGI APP的request/response进行相应的包装。在ConfigurableMiddleware类中,分别定义了process_request(request)和process_response(response, request)方法分别对request和response进行处理。最后,该类还为paste.deploy实现了factory方法,使其可以通过读取WSGI配置文件调用相关类的装饰器。了解了ConfigurableMiddleware类的实现之后,下面便可以根据ConfigurableMiddleware类的实现针对具体的pipeline的实现进行详细的解读。
1.1 CORS
CORS指的是跨域资源共享,该机制允许Web服务器进行跨域访问控制,从而使得跨域数据传输得以安全进行。浏览器支持在API容器中使用CORS,以降低跨域HTTP请求所带来的风险。CORS在原有HTTP协议基础上新增了一组HTTP首部字段,用以表示服务器声明哪些源站可以访问哪些资源,这些字段包括Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers、Access-Control-Max-Age等。关于CORS的具体介绍,本文不作详细解释,感兴趣的朋友可以参考以下的博文https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS。
而oslo.middleware中的CORS即是为WSGI请求或响应添加CORS字段和处理的pipeline,其覆写了父类的process_request(request)和process_response(response, request)方法来实现其功能。
simple_headers = [
'Accept',
'Accept-Language',
'Content-Type',
'Cache-Control',
'Content-Language',
'Expires',
'Last-Modified',
'Pragma'
]