Paste 起步

来源:互联网 发布:区域语言软件 编辑:程序博客网 时间:2024/04/29 00:38

本文地址: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:...] 表示将请求分发到不同的程序中去。

[plain] view plaincopyprint?
  1. [composite:main]  
  2. use = egg:Paste#urlmap  
  3. / = home  
  4. /blog = blog  
  5. /wiki = wiki  
  6. /cms = config:cms.ini  
  7.   
  8.   
  9. [filter-app:blog]  
  10. use = egg:Authentication#auth  
  11. next = blogapp  
  12. roles = admin  
  13. htpasswd = /home/me/users.htpasswd  
  14.   
  15. [app:blogapp]  
  16. use = egg:BlogApp  
  17. database = sqlite:/home/me/blog.db  
  18.   
  19. [app:wiki]  
  20. use = call:mywiki.main:application  
  21. database = sqlite:/home/me/wiki.db  

配置文件各段说明:

[plain] view plaincopyprint?
  1. [composite:main]  
  2. use = egg:Paste#urlmap  
  3. / = home  
  4. /blog = blog  
  5. /cms = config:cms.ini  

这是一个composite段,表示将请求分发到不同的程序中。
use = egg:Paste#urlmap 使用urlmap 程序(Paste package中的composite application)。urlmap使用路径前缀(path prefix)将请求映射到另一个程序(home, blog)等。
而/cms则指向了同目录下的cms.ini配置文件。

[plain] view plaincopyprint?
  1. [filter-app:blog]  
  2. use = egg:Authentication#auth  
  3. next = blogapp  
  4. roles = admin  
  5. htpasswd = /home/me/users.htpasswd  

[filter-app:blog] 表示对拥有filter功能的程序。

The egg:Authentication#auth 实际是不存在的,但是我们可以把它想成是记录用户登录,并进行身份验证的操作。

roles,htpasswd作为参数传入Authentication函数中去。

next表示验证身份后要执行的app

[plain] view plaincopyprint?
  1. [app:blogapp]  
  2. use = egg:BlogApp  
  3. database = sqlite:/home/me/blog.db  
use = egg:BlogApp 使用一个pip install安装的BlogApp程序。

[plain] view plaincopyprint?
  1. [app:wiki]  
  2. use = call:mywiki.main:application  
  3. 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中的程序。

[python] view plaincopyprint?
  1. from paste.deploy import loadapp  
  2. wsgi_app = loadapp('config:/path/to/config.ini')  

Applications

可以在一个文件中定义多个程序,每一个应用程序有自己的段(section)。即便只有一个程序,也需要将它放于段中。

定义一个程序,需要在段名前加app前缀。例如:main段为[app:main];若只有一个程序,可以省略段名,直接[app]


有两种方式来声明一个程序,第一是通过指向另一个URI或name。

[plain] view plaincopyprint?
  1. [app:myapp]  
  2. use = config:another_config_file.ini#app_name  
  3.   
  4. # or any URI:  
  5. [app:myotherapp]  
  6. use = egg:MyApp  
  7.   
  8. # or a callable from a module:  
  9. [app:mythirdapp]  
  10. use = call:my.project:myapplication  
  11.   
  12. # or even another section:  
  13. [app:mylastapp]  
  14. use = myotherapp  

另一种方式是完全指向Python代码。

[plain] view plaincopyprint?
  1. [app:myapp]  
  2. paste.app_factory = myapp.modulename:app_factory  

加载myapp.modulename模块,从中检索app_factory对象。


Composite Applications

“Composite” applications由一组程序组成。其中一种用法是URL mapper,将URL映射到不同程序中。

[plain] view plaincopyprint?
  1. [composite:main]  
  2. use = egg:Paste#urlmap  
  3. / = mainapp  
  4. /files = staticapp  
  5.   
  6. [app:mainapp]  
  7. use = egg:MyApp  
  8.   
  9. [app:staticapp]  
  10. use = egg:Paste#static  
  11. document_root = /path/to/docroot  

composite application “main”像其它程序一样,可以使用loadapp加载,但是它可以访问到配置文件中定义的其它程序。


Filter Composition

可以定义多个filter,并且可以控制它们施行顺序。

[plain] view plaincopyprint?
  1. [app:main]  
  2. use = egg:MyEgg  
  3. filter-with = printdebug  
  4.   
  5. [filter:printdebug]  
  6. use = egg:Paste#printdebug  
  7. # and you could have another filter-with here, and so on...  

在执行MyEgg之前,先执行printdebug。


此外,还有两种类型的filter,如filter-app, pipeline

[plain] view plaincopyprint?
  1. [composite:main]  
  2. use = egg:Paste#urlmap  
  3. / = home  
  4. /blog = blog  
  5. /wiki = wiki  
  6. /cms = config:cms.ini  
  7.   
  8.   
  9. [filter-app:blog]  
  10. use = egg:Authentication#auth  
  11. next = blogapp  
  12. roles = admin  
  13. htpasswd = /home/me/users.htpasswd  
  14.   
  15. [app:blogapp]  
  16. use = egg:BlogApp  
  17. database = sqlite:/home/me/blog.db  
匹配到“/blog”, 调用名为blog的filter-app段。使用Authentication进行身份验证。

然后通过关键字next指明下一步要运行的app,即blogapp。相当于在执行blogapp的前面,执行了一个filter。


[plain] view plaincopyprint?
  1. [pipeline:main]  
  2. pipeline = filter1 filter2 filter3 app  
  3.   
  4. [filter:filter1]  
  5. ...  

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
定义一个回调函数

[python] view plaincopyprint?
  1. def app_factory(global_config, **local_conf):  
  2.     return wsgi_app  
global_config为一个字典为全局配置,而local configuration传送给local_conf,该函数返回一个WSGI程序。
原创粉丝点击