Paste deploy &Python

幫助文檔http://pythonpaste.org/deploy/module-paste.deploy.html

Paste Deployment是用於發現和配置WSGI appliactionserver的系統。對於WSGI application用戶提供一個單獨的簡單的函數(loadapp),用於從配置文件或者python egg中加載WSGI application。因爲WSGI application提供了唯一的單獨簡單的訪問入口,所以application 發佈者並不需要暴露application的內部的實現細節。

那麼系統管理員可在不瞭解任何python知識或者WSGI Application或者WSGI container的情況下進行安裝和管理。Paste Deployment目前已經不需要Paste項目的其他部分支持,可以單獨做一個package進行使用。Paste Deploy的發佈在MIT license

Paste Deploy目前已經通過了V1.0

必須注意的地方:Paste Deploy最關鍵的地方是入口點entry points(例如,paste.app_factory(入口點是python 項目發佈時定義的,並且會指定發佈的程序的入口點符合的protocal的種類,後面會有介紹並不是這些入口點唯一的使用者,很多擴展可能直接去使用這些入口點,這樣做可能比通過Paste Deploy使用更好。入口點是不能發生變化的,如果改變是必須的話,只能定義新的入口點。

1.1.1.    Paste.deploy 基本的使用

可以使用Paste Deployment用於加載WSGI的應用,大多數的Python框架都支持WSGI。主要的函數是paste.deploy.loadapp,基本使用方法如下:

from paste.deploy import loadappwsgi_app = loadapp('config:/path/to/config.ini')

目前支持兩種URI模式config:和egg

 

1.1.1.1.            config:URIs

config:URIs——URI表示配置文件(不同於3.3.1節的配置文件,此處的配置文件是用於指示,所需要加載的application是哪些)的位置

配置文件的格式:

[section_name]

key = value

another key = a long value

 that extends over multiple lines

所有的value都是string類型,keysection name都是大小寫敏感的,並且可以包含標點符號和空白符,但是頭部和尾部的空白部分將會去掉。

如果出現需要斷行的情況,只需要在下一行開始時是空白符即可

#;表示註釋。

配置文件中可能會定義多個application,定義方式如下:

application定義

在一個文件中可以定義多個application,每個application都應該有自己獨立的section,即使僅有一個application存在,也需要寫入到section中。

每個定義一個applicationsection都應該以app:前綴開頭。main section進入[appmain][app]

指定運行applicationPython code方式有兩種:

第一種方法,指向其他的URI(前兩個section)或name(後兩個section

[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

Configuration

配置了use字段或者通過協議名稱(上面提到的兩種方法),就完成了配置文件最基本的配置,section中其他的key都會作爲關鍵字參數傳遞給factory。下面看一個例子:

[app:blog]

use = egg:MyBlog

database = mysql://localhost/blogdb

blogname = This Is My Blog!

定義了一個application,名字爲blog,運行的程序是MyBlog(他是一個egg),需要傳遞給MyBlog的參數是databaseblogname

這裏有個比較有趣的例子,我們可以再定義另外一個section去覆蓋上面的配置,如下:

[app:otherblog]

use = blog

blogname = The other face of my blog

use = blog”表明使用的應用程序是section blog

但是傳遞的參數是:blogname = The other face of my blog,覆蓋掉了section blog的對應的配置信息。這種設置方式也可以定義在普通的配置文件中,即使用use = config:other_config_file 這種方式進行。

這種方式看起來好像是沒什麼意義的,只是從一個位置指向另一個位置,而實際上這對於增添和更新application是非常有效的。

Global Configuration

當多個application需要共享相同的配置時,我們可以採用上述的方法,使用其他的section,如果想要不同的value值,則重新定義覆蓋掉它。但是這種方法,不能夠添加其他的配置參數,即只能覆蓋掉usesection中已經定義的部分。

所以可以採用[DEFUALT]方法定義全局的配置信息,[DEFUALT]的配置信息將會全部傳入到所有的Application中,通常情況下,也可作爲application的默認設置。application可以自主定義覆蓋全局的默認值

爲免去對所有application配置全局共享信息的麻煩可以使用[DEUALT]section,注意DEFUALT是大小寫敏感的。

[DEFAULT]

admin_email = [email protected]

 

[app:main]

use = ...

set admin_email = [email protected]

set關鍵字使用,將會覆蓋掉global的對應的配置。

第二種方法,精確定義application需要運行的Python code

[app:myapp]

paste.app_factory = myapp.modulename:app_factory

這種方式必須明確指定使用的protocol(此例中是paste.app_factory),value值表示需要import的內容。此例中是import myapp.modulename,然後檢測app_factory執行

application的其他類型:composition application

composition application:類似與application,但是他是由多個application組成的,一個簡單的例子就是URL mapper,例如,

[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

使用loadapp加載composition application “main” 看起來就是和其他應用程序相同的,僅是一個application,但是根據配置文件的設置,“main”是可以訪問其他的application的。

filter composition

可以採用不同的方式將filter應用到application中,通常情況下依賴於需要使用多少個filter和使用filter的順序。

第一種方法:filter-with設置

[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...

另一種方法:filter-app pipeline

此外,還有兩個特殊的section可以添加filterapplication中去:[filter-app:] [pipeline:]

filter-app定義一個filter,並且使用一個特殊的關鍵字next指向application,將application添加到filter(這與[filter:…]很類似)

pipeline:當需要定義一系列的fiter時應用。在configuration中添加關鍵字pipelinepipeline是一個filters的鏈表,以一個application結束,例如

[pipeline:main]

pipeline = filter1 egg:FilterEgg#filter2 filter3 app

 

[filter:filter1]

...

注:參考博文http://blog.csdn.net/sonicatnoc/article/details/6539716

裏面描述filter調用的順序,其實是一個嵌套的過程,調用的過程是不斷的返回

filter1->filter2->filter3->……->end_app

執行的時候是

end_app->……->filter3->filter2->filter1

1.1.1.1.            配置文件簡單例子

Paste Deploy交互的主要方式是通過配置文件,一個非常簡單配置文件的例子如下:

[app:main]

use = egg:PasteEnabledPackage

option1 = foo

option2 = bar

 

[server:main]

use = egg:PasteScript#wsgiutils

host = 127.0.0.1

port = 80

每個[]表示一個section,彼此間是獨立的。

[type:name]

[app:main]Paste Deploy認爲是一個名字爲mainapplication

配置文件的內容都是以“name=value”的形式進行表示的,如果有多個value,那麼就表示爲“ name = value1#value2#value3”類似的模式。

[app:main]appliction section

[server:main]server section

[composite:…]用於調度多個applicationcompostion是複合的意思

 

 

 

use = egg:PasteEnabledPackage

表示名爲PasteEnabledPackagePackage將被運行,這個Package的格式是egg的格式。而後面的字段,將作爲關鍵字參數傳遞給PastEnablePackage

2section[servermain],名爲mainserver

use = egg:PasteScript#wsgiutils

表示使用發佈的egg文件PasteScript中的wsgiutils程序

官網上的例子

[composite:main]

use = egg:Paste#urlmap

/ = home

/blog = blog

/wiki = wiki

/cms = config:cms.ini

 

[app:home]

use = egg:Paste#static

document_root = %(here)s/htdocs

 

[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]section,這是一個composite類型的section,意味着將會調度請求到其他的application中去。use = egg:Paste#urlmap,表明使用的compostite AppliacitonPaste.urlmapurlmap是一個特殊的composite application,它可以根據請求的前綴,調度到其他的application中去。如配置文件中所示

[composite:main]

use = egg:Paste#urlmap

/ = home #請求前綴“/”轉去home application

/blog = blog  #請求前綴“/blog”轉去blog application

/wiki = wiki #請求前綴“/wiki”轉去wiki application

/cms = config:cms.ini # just refers to another file cms.ini in the same directory.

[app:home]section

[app:home]

use = egg:Paste#static

document_root = %(here)s/htdocs

其他部分

[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]

[app:wiki]

use = call:mywiki.main:application

database = sqlite:/home/me/wiki.db

 

1.1.1.2.            egg: URIs

Python Egg是使用setuptools發佈和安裝形式,並且將metadata添加到普通的Python package

對於egg有兩個重要的地方:

第一,specificaition——name關鍵字指定egg 的名字,並且能夠指定egg的版本號

第二,entry point —— 指向了你創建的packagesPython Object,並且指明Protocol的具體類型。

swiftsetup.py爲例:protocolpaste.app_factory,包含的應用程序名稱是proxyobjectcontaineraccount,你可以通過egg:egg名字#應用程序名字獲取應用程序服務,以swift爲例

name=’swift’

那麼object應用程序的URI表示爲egg:swift#object

value是導入objects的命令,主入口函數在swift.obj.serverapp_factory函數

 SHAPE  \* MERGEFORMAT

entry_points={

        'paste.app_factory': [

            'proxy=swift.proxy.server:app_factory',

            'object=swift.obj.server:app_factory',

            'container=swift.container.server:app_factory',

            'account=swift.account.server:app_factory',

            ],

      是一個callable object是在ini文件中default section中定義的一系列key-value對,而**kwargs,即一些本地配置,是在ini文件中,filter:xxx section中定義的一系列key-value對。filter_factory<span times="" new="" roman";="" mso-hansi-font-family:"times="" roman";mso-bidi-font-family:"times="" mso-font-kerning:1.0pt;mso-ansi-language:en-us;mso-fareast-language:zh-cn;="" mso-bidi-language:ar-sa"="" style="word-wrap: break-word; font-size: 10.5pt; font-family: 宋體;">返回一個filter對象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章