2006/01/21

CherryPy 2.1




CherryPy
2.1






參照The
CherryPy Documentation
整理了一些東西






Hello
World!



import
cherrypy


class HelloWorld:

def index(self):
# Let's link to another method here.
return 'We have an <a href="showMessage">important message</a> for you!'
index.exposed = True

def showMessage(self):
# Here's the important message!
return "Hello world!"
showMessage.exposed = True

cherrypy.root = HelloWorld()

if __name__ == '__main__':
cherrypy.config.update(file = 'tutorial.conf')
cherrypy.server.start()



上面是一個簡單的CherryPy
Hello World!
,長
得非常像一般的
python程式。其中的差異在於:




  • index.exposed
    = True


    class
    中的method需設定哪些可以透過URI來存取,如此例中index()




  • cherrpy.root
    = HelloWorld()


    所有的CherryPy程式都需要一個root(一個可呼叫的物件),來當作是對應URL的起點(CherryPy會從root開始尋找其對應在URLmethod)




  • CherryPy並不要求class該要擁有哪些的method,除了index()default()之外。同樣的,index()default()也是需要exposed才能被使用。




  • index()是預設的首頁(如同Apacheindex.html同等地位),而root.index就是主機上的"/"




  • default()是當CherryPy無法搜尋到對應到URLmethod時則會被CherryPy所呼叫。




  • Published
    vs Exposed

    published
    是將一個可呼叫的物件指定給CherryPyobject tree上。

    Exposed

    設定物件的哪些屬性可以透過
    URL來存取。





  • 設定為
    exposedmethod可以傳回a string, a list, a generator








Filters






Filters是用來處理底層HTTP
request/reponse
classCherryPy內建了一些filters但預設是關閉的。要開啟內建的filters則需要使用configuration
system
來設定:







使用內建的filters:




  • 先決定
    該在哪裡使用
    filters,由於CherryPy會維護一個object tree,所以當某個分枝套用filters時,其所有的子分枝都會自動套用。




  • 要啟用
    某個
    filter需在設定檔中設定為: filterName.on
    = True




Example:


[/entries/view]
tidyFilter.on = True
tidyFilter.tmpDir = "/tmp"
tidyFilter.strictXml = True


使用自
訂的
filter:


使用自
訂的
filter並不需
要在設定檔中做額外的設定,只需要在類別定義中加入
_cpFilterList即可。



import cherrypy
from myfiltermodule import MyFilterClass

class Entry:
_cpFilterList = [ MyFilterClass() ]
def view(self, id):
# do suff...
view.exposed = True

class Root: pass

cherrypy.root = Root()
cherrypy.root.entries = Entry()
cherrypy.server.start()


Configuration
system


Configuration
system
主要是用來設定:




  • Web
    Server















































gobal



description



server.socketPort



Server port (default 8080)



server.logFile



Server日誌檔,包含了啟動設定、tracebacksHTTP requests等資訊,預設為關閉,並將log顯示在銀幕上。



server.logAccessFile



參照List
of core (ie: not for filters) config options



server.logToScreen



log data顯示在畫面上,預設是True



server.logTracebacks



tracebacks顯示在畫面上,預設是True,若設定為False則會回應500



server.maxRequestHeaderSize



最大可接受的request header size,預設是500KB,若超過此大小則回應413



server.maxRequestBodySize



最大可接受的request body size,預設是100MB,若超過此大小則回應413



TODO



其他








  • Filters




而設定內容可以
是檔案或者是
python
dict
物件


Session
Management


Session是透過sessionFilter來管理,同樣的
要使用
sessionFilter必須要在設定檔
案中設定
sessionFilter.on
= True
,之後便可以使用cherrypy.session(a
dict-lik object
,該dict會擁有_id
key
作為session
id)
來存取。


























































sessionFilter屬性



description



on



True/False(default)
啟用/關閉session filter



storageType



Server side session storeage.ram(default), file or PostgreSQL



storagePath



storageType
定為
file
的儲存路徑



timeout



設定非活動session的清除時間,預設60分鐘



cleanUpDelay



設定清除過期session的時間,預設每隔5分鐘



cookieName



Cookie的名稱用來儲存session ID,等同於sessionID



getDB



storeageType設定為PostgreSQL
時,才有作用



deadlockTimeout



請參照Handling
concurrent requests for the same session data



onCreateSession



session建立時,可設定一個callable物件給sessionFilter



onDeleteSession



session刪除時,可設定一個callable物件給sessionFilter



storageClass



指定自訂的session storeage class,請參照Writing
your own custom backend



locking



Explicit(default)
/ implicit

設定自動
/被動鎖定session dataconcurrent request發生時








Static
content handling


Static
content
是透過staticFilter來處理。StaticFilter.root設定static
content
的根目錄,可使用相對或絕對路徑,若使用相對路徑則以cherrypy.root為基準。

範例中靜態內容的根目錄位於"/home/site"下,而/style.css則為"/home/site/style.css",而"/static"則對應到"/home/site/static/*"



[global]
staticFilter.root = "/home/site"

[/style.css]
staticFilter.on = True
staticFilter.file = "style.css"

[/static]
staticFilter.on = True
staticFilter.dir = "static"


File
upload


CherryPy在處理上傳的檔
案時,會將所上傳的檔案儲存在一個暫存檔裡,並傳回一個
FileStoreage
instance
包含了該上傳檔案的資訊,並將FileStoreage
instance
傳給處理的methodFileStoreage
instance
擁有下列屬性:




  • file:
    file-like object




  • filename:
    檔名




  • type:
    content-type of file




Exceptions
and Error Handling


當未處理例外事
件發生時,會呼叫
_cpOnError函數來處理,而HTTPErrorHTTPRedirect等例外事件則是
回應錯誤訊息給
response




PySQLite 2.1


PySQLite 2.1


PySQLite 2.1之後增加了一些新功能

  • Statement caching

  • More flexibility for TEXT data

  • Highly optimized row_factory for column access by name

  • Convenience methods

  • API changes



Statement caching

每一道SQL敘述都要經過COMPILEEXECUTED兩個階段(除了使用executemany之外),而透過statement caching可以減少花費在PARSECOMPILE上面的時間。預設的cached_statements100,要修改則在sqlite.connect()中加入cached_statements參數即可。例如:

    
con = sqlite.connect(..., cached_statements=30)


目前只能用在execute()parameter-formparamstyle,例如:


 cur.execute("insert into foo(bar) values (?)", ("xy",))
cur.execute("insert into foo(bar) values (?)", ("ab",))


More flexibility for TEXT data

因為PySQLite對於文字資料預設傳回都是unicode string,而現在可以透過設定connection object的屬性text_factroy來加以修改其傳回型態。例如:

 
con.text_factory = str              # ... to always return bytestrings

或者是對於non-ASCII資料則傳回unicodeASCII資料則傳回str:

con.text_factory = sqlite.OptimizedUnicode



Highly optimized row_factory for column access by name

PySQLite 2.1Connection object增加了一個row_factory屬性,可以讓row data的存取類似於dict物件一般。sqlite.ROW則是PySQLite內建的row factory

 from pysqlite2 import dbapi2 as sqlite
con = sqlite.connect(...)
con.row_factory = sqlite.Row
cur = con.cursor()
cur.execute("select name_last, age from people")
for row in cur:
print row["Name_Last"], row[1]

Convenience methods
Connection object
下建立execute(), executemany() executescript()等捷徑。

con = sqlite.connect(...)
con.execute("insert into foo(bar) values (5)")
for row in con.execute("select bar from foo"):
print row

API changes

cursor object下的row_factory搬移到Connection object下。