Paste 起步

本文地址: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

这是一个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
use = egg:BlogApp 使用一个pip install安装的BlogApp程序。

[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
匹配到“/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。


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
global_config为一个字典为全局配置,而local configuration传送给local_conf,该函数返回一个WSGI程序。



你可能感兴趣的:(Paste 起步)