谈到WSGI,就免不了要了解paste,其中paste deploy是用来发现和配置WSGI应用的一套系统,对于WSGI应用的使用者而言,可以方便地从配置文件汇总加载WSGI应用;对于WSGI应用的开发人员而言,只需要给自己的应用提供一套简单的入口点即可。
 paste deploy的官方介绍在这里,其发布在Pypi上的发行包在这里下载。借助Python的pypi包管理机制,我们可以非常方便地安装PasteDeploy:

# pip install PasteDeploy

既然PasteDeploy是用来配置和管理WSGI 应用的,不妨首先看一下PasteDeploy配置文件的格式。

1 PasteDeploy配置文件格式

PasteDeploy配置文件由若干section组成,section的声明格式如下:

[type:name]
  其中,方括号括起的section声明一个新section的开始,section的声明由两部分组成,section的类型(type)和section的名称(name),如:[app:main]等。section的type可以有:app、composite、filter、pipeline、filter-app等。

每个section中具体配置项的格式就是基本的ini格式:key = value,此外,PasteDeploy的配置文件中使用“#”标注注释。

在基本了解PasteDeploy配置文件的书写格式后,我们不妨看一个实例,来具体了解不同type的section。

2 PasteDeploy中section的type

示例1:PasteDeploy配置文件

  [composite:main]use = egg:Paste#urlmap/ = home/blog = blog/wiki = wiki/cms = config:cms.ini[app:home]use = egg:Paste#staticdocument_root = %(here)s/htdocs[app:wiki] use = call:mywiki.main:application database = sqlite:/home/me/wiki.db[filter-app:blog] use = egg:Authentication#auth next = blogapp roles = admin htpasswd = /home/me/users.htpasswd [app:blogapp]use = egg:BlogAppdatabase = sqlite:/home/me/blog.db[app:main]use = egg:MyEggfilter-with = printdebug[filter:printdebug] use = egg:Paste#printdebug [pipeline:main]pipeline = filter1 filter2 filter3 app

上面的示例文件列出了若干不同type的section示意,下面就一一探讨PasteDeploy可定义的section type.

2.1 Type = composite(组合应用)

顾名思义,组合应用由若干WSGI应用组成,composite为这些应用提供更高一层的分配工作。
  我们具体分析示例1中的如下部分:

[composite:main]
use = egg:Paste#urlmap
/ = home
/blog = blog
/wiki = wiki
/cms = config:cms.ini

该段配置文件定义了一个名为main、类型为composite的section,方括号的声明以下是该section的具体配置,遵循 key = value 的统一格式。
  Composite类型的section将URL请求分配给其他的WSGI应用。
   use = egg:Paste#urlmap 意味着使用 Paste 包中的 urlmap 应用。urlmap是Paste提供的一套通用的composite应用,作用就是根据用户请求的URL前缀,将用户请求映射到对应的WSGI应用上去。这里的WSGI应用有:“home”, “blog”, “wiki” 和 “config:cms.ini”。
  最后一项仅仅是参考了同一个目录中的另一个文件"cms.ini"

2.2 Type = app(WSGI应用)

回到示例1中的下一部分:

[app:home]
use = egg:Paste#static
document_root = %(here)s/htdocs[app:wiki]
use = call:mywiki.main:application
database = sqlite:/home/me/wiki.db

app类型的section声明一个具体的WSGI应用。调用哪个python module中的app代码则由的use后的值指定。
  这里的 egg:Paste#static 是另一个简单应用,作用仅仅是呈现静态页面。它接收了一个配置项: document_root ,后面的值可以从全局配置DEFAULT中提取,提取方法s是使用变量替换:比如 %(var_name)s 的形式。
  这里 %(here)s 的意思是这个示例配置文件所在的目录,因为相对路径在不同服务器中的解释方法不同,出于移植性的考虑,官方文档上推荐当前这种写法。
  示例中定义了多个app类型的section,因为PasteDeploy的配置文件中允许定义多个app类型的section,同时要求每个WSGI应用也都应该拥有自己的section。这样,每一个WSGI应用在配置文件中都有一个app类型的section与之对应,默认地,"main"应用对应于 app:main 或 app 。
  应用的具体实现要在section中配置,有两种方法专门用于指出应用对应的代码:使用URI(用use标识)或 直接指向实现代码(用protocol标识)。

2.2.1 使用另一个URI

采用该方法的特点是指出应用的实现代码的那一条 key = value 配置项采用"use"作为键,该方法也有许多变种,官方的示例中给出了一些介绍:

[app:myapp]
use = config:another_config_file.ini#app_name# 或任意URI:
[app:myotherapp]
use = egg:MyApp
# 或指明某个模块中的可调用:
[app:mythirdapp]
use = call:my.project:myapplication
# 甚至是其他的section:
[app:mylastapp]
use = myotherapp

最后指向其他的section的那个例子,看起来似乎没有什么意义,似乎只是两个相同的WSGI应用。但是这样的定义允许我们在 [app:mylastapp] 这个应用中定义一些局部的配置项,从而在重用代码的同时覆写它引用的应用配置。

2.2.2 直接指向应用的实现代码

采用该方法的特点是指出实现代码的那一条 key = value 配置项采用“协议”作为键,所谓“协议”即protocol,告诉PasteDeploy即将加载的对象类型,如:

[app:myapp]
paste.app_factory = myapp.modulename:app_factory

该例的protocol paste.app_factory 是一个应用的工厂函数,指明import对象的类型;值 myapp.modulename:app_factory 指明具体加载的模块和方法。
  关于PasteDeploy的协议,进而可以定义的工厂函数类型,我们在下文对所有section可选的type有一定的了解后再进行探讨。

2.3 Type = filter(过滤器)

filter是作用于WSGI应用上的函数或方法,以app为唯一的参数,并返回一个“过滤”后的app。归功于WSGI接口的规范,不同的filter可以依次“过滤”某一app,事实上多个filter处理一个app也就是下文中提到的管道(pipeline)。
  在PasteDeploy的配置文件中有多种方法来“过滤”应用,比如示例1中:

[app:main]
use = egg:MyEgg
filter-with = printdebug
[filter:printdebug]
use = egg:Paste#printdebug

在 [app:main] 的 filter-with 字段指明用来处理该应用的filter,就指定了名为"printdebug"的filter来处理应用"main"。在 [filter:printdebug] 中还可以定义新的 filter-with 字段,从而将处理关系延续下去。

2.4 Type = filter-app

同样是处理应用,在PasteDeploy配置文件中可以有着不同的写法,比如示例1中的下面部分,就是使用filter-app类型的section来声明一个filter:

[filter-app:blog]
use = egg:Authentication#auth
next = blogapp
roles = admin
htpasswd = /home/me/users.htpasswd [app:blogapp]
use = egg:BlogApp
database = sqlite:/home/me/blog.db

该部分采用了[filter-app:NAME]类型的section声明了一个filter,指定使用的代码,以及要处理的应用: next 字段的值。从而PasteDeploy会自动地将过滤器"blog"作用在应用"blogapp"上。

2.5 Type = pipeline

pipeline便于对一个应用添加多个过滤器,比如示例1中:

[pipeline:main]
pipeline = filter1 filter2 filter3 app

就指定了在app上施加三个filter进行处理。
  总结起来,想要在某个应用前添加多个filter,共有 [filter-app:…] [pipeline:…] 和 [app:…] filter-with = … 等方法。

3 局部配置与全局配置

3.1 局部配置与全局配置的格式

PasteDeploy配置文件的所有配置项均使用 key = value 格式,但是局部配置项和全局配置项定义的位置不同。如:

[app:blog]
use = egg:MyBlog
database = mysql://localhost/blogdb
blogname = This Is My Blog![app:otherblog]
use = blog
blogname = The other face of my blog

每一个section内设置具体的键值关系,构成这些section自己的局部配置。

为了便于不同的应用读取某些固定的系统信息,PasteDeploy允许设置全局配置变量,所有的全局配置必须放在[DEFAULT]字段下设置,如:

[DEFAULT]
admin_email = webmaster@example.com[app:main]
use = ...
set admin_email = bob@example.com

注意[DEFAULT]段名是大小写敏感的,因此必须严格大写。

3.2 局部配置和全局配置的覆写

3.1中的两个例子,实际上展示了局部配置和全局配置的覆写,这里详细介绍,首先看局部配置的覆写:

[app:blog]
use = egg:MyBlog
database = mysql://localhost/blogdb
blogname = This Is My Blog![app:otherblog]
use = blog
blogname = The other face of my blog

从2.2.1中已经知道,一些section可以直接复用其他section的代码,并定制配置信息,这里 [app:otherblog] 就采用了 [app:blog] 的代码,同时将配置项 blogname 改为自己特定的。
  另一方面,应用在本地可以修改全局配置项的值:

[DEFAULT]
admin_email = webmaster@example.com[app:main]
use = ...
set admin_email = bob@example.com

只需要在要覆写的键前加 set 即可。
  至于为什么要探讨局部配置与全局配置,是因为二者在传递给不同类型的factory function时对应的参数不同,这些将在下文详细探讨。

4 实现factory

本文的第二部分探讨了PasteDeploy中的若干种“协议”,事实上对应了实现时的不同类型,包括 paste.app_factory paste.composite_factory paste.filter_factory paste.server_factory 等。
  这些“协议”封装WSGI应用,使其成为app、composite、filter等类型的组件.

paste deploy 解说和使用相关推荐

  1. python中的paste deploy

    谈到WSGI,就免不了要了解paste,其中paste deploy是用来发现和配置WSGI应用的一套系统,对于WSGI应用的使用者而言,可以方便地从配置文件汇总加载WSGI应用(loadapp):对 ...

  2. Python.Paste指南之Deploy(1)-概念

    Paste.Deploy主要是用来载入WSGI中的Web App使用,其核心函数是loadapp(),下文中PD就指代Paste.Deploy. OS:Ubuntu12.04 2012年11月17日 ...

  3. Paste模块的世界

    1. 缘起 当看到OpenStack的api-paste.ini中大量出现的composite,pipline,filter,app之后顿时觉得不淡定了,这些都是啥,是啥!在详细研究一番之后,却发现了 ...

  4. Python Paste 学习笔记

    一.写在前面 这篇文章主要介绍了Python的Paste库的使用,学习过程中主要参考官网文档以及自己的理解,整理成笔记以便后续自己查阅. 如果转载,请保留作者信息. 邮箱地址:jpzhang.ht@g ...

  5. python paste介绍和使用教程

    paste定义了一些列wsgi开发的库, paste.deploy定义了配置wsgi应用程序的ini文件格式和对应的解析库,此外还提供了一个简单的函数(loadapp),用于从ini格式的配置文件中加 ...

  6. openstack基础之python WSGI,paste,Routes,webob

        在阅读OpenStack各个组件源码的过程中,发现所有的模块如nova,neutron等,都通过wsgi的方式对外提供restful API.     而且在使用wsgi的过程中,还涉及pas ...

  7. keystone WSGI流程

    作为OpenStack两种基本的通信方式(RESTful API与消息总线)之中的一个.理解RESTful API的设计思路和运行过程,有助于我们对OpenStack有更好的理解.RESTful仅仅是 ...

  8. nova api 分析

    0. 总览 nova的服务在功能上主要分为应用层和逻辑层两类,nova-api就是应用层的服务,而nova-scheduler.nova-conductor等则是逻辑层服务.本文主要通过注释的方式讲述 ...

  9. python1000个常用代码-1000个常用的Python库和示例代码

    下面是programcreek通过分析大量开源代码,提取出的最常用的python库. 1. sys (4627) 2. os(4088) 3. re(3563) 4. time(3195) 5. da ...

最新文章

  1. flash写保护原理_一种基于flash写保护的防止flash被意外篡改的方法与流程
  2. 添加Page_Init事件
  3. 迷宫问题让你深度理解递归(回溯)
  4. FIR定点提高精度的trick_02
  5. 《四世同堂》金句摘抄(十六)
  6. python社区版可以用库么_应用Python,你不但能够得到出色的小区适用和普遍的库集...
  7. 武汉大学计算机学院c404,985录取名单(武大)!武大不歧视!80分政治复习路线图!最新调剂信息!...
  8. Myeclipse学习总结(17)——Java主流IDE优缺点分析
  9. 到底应不应该表达自己对工作安排的不满?
  10. MySQL(三) —— 约束以及修改数据表
  11. jmeter测试接口--form表单提交请求(解决请求传参为空的问题)
  12. 整数、区间与区间端点(三)
  13. 【笔试/面试】—— 奇葩 C/C++ 语法题(二)
  14. 概率论中的一些常见的分布与公式
  15. Failed to meta-introspect annotation interface org.springframework.web.bind.annotation.RequestBody:
  16. 计算机驱动打不开,驱动人生打不开怎么办
  17. XTP控件ReportCtrl使用
  18. ubuntu设置开机启动图形应用程序,替换默认图形桌面
  19. 计算机硬盘对考,两个硬盘对拷(硬盘对刻)图文教程
  20. java氧气版,氧气呼吸器属于( )。

热门文章

  1. Western Blot
  2. vs2008下载地址大全
  3. 线性代数2givens矩阵c语言,数值线性代数习题解答.doc
  4. Alcohol.120%.v1.9.8.7530.Retail.Incl.Activation.Keymaker-BetaMaster
  5. 【Linux云计算架构:第四阶段-Linux虚拟化-私有云-docker】第7章—— 部署 docker 容器虚拟化平台
  6. PageHelper是怎么分页的
  7. Android Studio 视频教程分享
  8. 【实习秋招篇之C++面经】
  9. 用简单的例子解释量子纠缠
  10. 用户产生内容(UGC)和用户创建市场(UGM)