不知不觉已经写了几篇有关 WSGI 的博文了,继续坚持。嗯,再来一篇,哈哈!
在以前博文 WSGI 和 Webob 中我们已经知道可以用原始或者装饰器的方法来实现应用的串联(中间件加应用)。这种方式应付比较简单的情况还可以,但如果出现多个中间件加应用的情况,这种方式就会有点力不从心了,代码逻辑的维护估计也是够呛。这时,PasteDeploy 的出现就可以解决我们的问题。PasteDeploy 利用配置文件就可以配置各种中间件和应用,让我们不用考虑中间件与中间件之间、中间件与应用之间的对接问题。
这样一来,我们就可以专注实现各种中间件和应用的逻辑。
关于 PasteDeploy 的详细介绍,可参考以下几个资料:
本文就不打算重新说一遍了,而是重点关注一些值得注意的地方。
另外,PasteDeploy 会用到 paste 其他组件,所以如果我们要研究源码,可以同时下载这两者的代码:
这两者都是使用 Mercurial 进行源码管理,如果要 clone 的话要安装 Mercurial 工具。
PasteDeploy 应用实例
博文 Python PasteDeploy 笔记的例子感觉很不错,所以就直接拿来改动下(主要是代码规范优化,原谅我的强迫症…)。先来看下配置文件:
1 | [DEFAULT] |
源码:
1 | ''' |
通过配置文件,我们知道总共有 2 个应用 showversion 和 calculator;1 个过滤器 logrequest;2 个流水线 root 和 calc。最后,我们使用 Paste 包的 urlmap
工具。如果我们看一下 urlmap 源码,我们会发现其实它也是一个 WSGI 应用(真是“万物”皆 WSGI 应用。其实,我们还可以想一下,为什么 URLMap 必须是一个 WSGI 应用
呢?):
1 | # paste/urlmap.py |
所以,知道这个工作流程后,其实我们会发现,其实 PasteDeploy 做的工作很简单,通过解析配置文件,建立起中间件、应用的流水线。
这就是这个工具的重点
。
初始化及调用 pipeline 的执行顺序
如果我们运行上边的例子,我们会得到下边的输出:
1 | in Calculator.factory ... |
但如果我们在浏览器输入 http://ip:8080/ 及 http://ip:8080/calc?op=plus&opnd1=1&opnd2=2 则可以在控制台看到如下结果:
1 | filter:LogFilter is called. |
也就是说,初始化 pipeline 和调用 pipeline 的执行顺序是相反的
。以 pipeline root 为例,前者的执行顺序相当于 LogFilter.factory(ShowVersion.factory),先执行的是括号里边的函数;后者的执行顺序相当于 ShowVersion.__call__(LogFilter.__call__),先执行的是也是括号里边的函数。
PasteDeploy 与 Webob
对上面的例子,我们还可以进一步优化,利用 webob.dec.wsgify 装饰器来将类转化为 WSGI 应用:
1 | ''' |