本文地址:http://blog.youkuaiyun.com/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
这是一个composite段,表示将请求分发到不同的程序中。
use = egg:Paste#urlmap 使用urlmap 程序(Paste package中的composite application)。urlmap使用路径前缀(path prefix)将请求映射到另一个程序(home, blog)等。
而/cms则指向了同目录下的cms.ini配置文件。
- [filter-app:blog]
- use = egg:Authentication#auth
- next = blogapp
- roles = admin
- htpasswd = /home/me/users.htpasswd
[filter-app:blog] 表示对拥有filter功能的程序。
The egg:Authentication#auth 实际是不存在的,但是我们可以把它想成是记录用户登录,并进行身份验证的操作。
roles,htpasswd作为参数传入Authentication函数中去。
next表示验证身份后要执行的app
- [app:blogapp]
- use = egg:BlogApp
- database = sqlite:/home/me/blog.db
- [app:wiki]
- use = call:mywiki.main:application
- database = sqlite:/home/me/wiki.db
wiki段跟blogapp段类似,唯一不同的是它直接指向一个mywiki.main module中的程序,而不是egg中的一个entry point。
mywiki.main模块,application为main模块中的操作。
简单用法
Paste的基本使用方式是用来加载WSGI applications。最主要的函数式paste.deploy.loadapp,加载给定URI中的程序。
- from paste.deploy import loadapp
- wsgi_app = loadapp('config:/path/to/config.ini')
Applications
可以在一个文件中定义多个程序,每一个应用程序有自己的段(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
另一种方式是完全指向Python代码。
- [app:myapp]
- paste.app_factory = myapp.modulename:app_factory
加载myapp.modulename模块,从中检索app_factory对象。
Composite Applications
“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
composite application “main”像其它程序一样,可以使用loadapp加载,但是它可以访问到配置文件中定义的其它程序。
Filter Composition
可以定义多个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
然后通过关键字next指明下一步要运行的app,即blogapp。相当于在执行blogapp的前面,执行了一个filter。
- [pipeline:main]
- pipeline = filter1 filter2 filter3 app
- [filter:filter1]
- ...
pipeline:用于需要多个filter的时候,pipeline为一组filters,并以一个程序结尾,相当于指明该pipeline属于哪一个app。
Defining Factories
有以下几种协议:
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_app