本文地址:http://blog.csdn.net/spch2008/article/details/9005669
Paste用于配置WSGI程序和服务器,它提供一个单一,简单的函数(loadapp)从配置文件中加载WSGI程序。
一个配置文件有不同的段。Paste Deploy只关心前缀部分,例如(app:main、filter:error)中的app, filter。“:”分号前面是类型,后面是段的名字。
配置文件是一个简单的INI格式的文件(name = value)。
通常,配置文件中至少有1个或2个段。main段:[app:main]应用程序段,[server:main]服务器配置段。
[composite:...] 表示将请求分发到不同的程序中去。
[composite:main] use = egg:Paste#urlmap / = home /blog = blog /wiki = wiki /cms = config:cms.ini [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 [app:wiki] use = call:mywiki.main:application database = sqlite:/home/me/wiki.db
[composite:main] use = egg:Paste#urlmap / = home /blog = blog /cms = config:cms.ini
[filter-app:blog] use = egg:Authentication#auth next = blogapp roles = admin htpasswd = /home/me/users.htpasswd
The egg:Authentication#auth 实际是不存在的,但是我们可以把它想成是记录用户登录,并进行身份验证的操作。
roles,htpasswd作为参数传入Authentication函数中去。
next表示验证身份后要执行的app
[app:blogapp] use = egg:BlogApp database = sqlite:/home/me/blog.dbuse = egg:BlogApp 使用一个pip install安装的BlogApp程序。
[app:wiki] use = call:mywiki.main:application database = sqlite:/home/me/wiki.db
Paste的基本使用方式是用来加载WSGI applications。最主要的函数式paste.deploy.loadapp,加载给定URI中的程序。
from paste.deploy import loadapp wsgi_app = loadapp('config:/path/to/config.ini')
可以在一个文件中定义多个程序,每一个应用程序有自己的段(section)。即便只有一个程序,也需要将它放于段中。
定义一个程序,需要在段名前加app前缀。例如:main段为[app:main];若只有一个程序,可以省略段名,直接[app]
有两种方式来声明一个程序,第一是通过指向另一个URI或name。
[app:myapp] use = config:another_config_file.ini#app_name # or any URI: [app:myotherapp] use = egg:MyApp # or a callable from a module: [app:mythirdapp] use = call:my.project:myapplication # or even another section: [app:mylastapp] use = myotherapp
[app:myapp] paste.app_factory = myapp.modulename:app_factory
“Composite” applications由一组程序组成。其中一种用法是URL mapper,将URL映射到不同程序中。
[composite:main] use = egg:Paste#urlmap / = mainapp /files = staticapp [app:mainapp] use = egg:MyApp [app:staticapp] use = egg:Paste#static document_root = /path/to/docroot
可以定义多个filter,并且可以控制它们施行顺序。
[app:main] use = egg:MyEgg filter-with = printdebug [filter:printdebug] use = egg:Paste#printdebug # and you could have another filter-with here, and so on...
在执行MyEgg之前,先执行printdebug。
此外,还有两种类型的filter,如filter-app, pipeline
[composite:main] use = egg:Paste#urlmap / = home /blog = blog /wiki = wiki /cms = config:cms.ini [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匹配到“/blog”, 调用名为blog的filter-app段。使用Authentication进行身份验证。
然后通过关键字next指明下一步要运行的app,即blogapp。相当于在执行blogapp的前面,执行了一个filter。
[pipeline:main] pipeline = filter1 filter2 filter3 app [filter:filter1] ...
pipeline:用于需要多个filter的时候,pipeline为一组filters,并以一个程序结尾,相当于指明该pipeline属于哪一个app。
有以下几种协议:
paste.app_factory, paste.composite_factory, paste.filter_factory, and lastly paste.server_factory.
它们都需要一个回调函数或方法或类。
举例:
paste.app_factory
定义一个回调函数
def app_factory(global_config, **local_conf): return wsgi_appglobal_config为一个字典为全局配置,而local configuration传送给local_conf,该函数返回一个WSGI程序。