CherryPy自帶了自己的web(HTTP)伺服器。這就是爲什麼CherryPy是自包含的,允許用戶在獲得庫的幾分鐘內運行CherryPy應用程式。
web伺服器充當應用程式的網關,通過它,所有請求和響應都保持在跟蹤狀態。
要啓動web伺服器,用戶必須進行以下調用−
cherryPy.server.quickstart()
CherryPy的內部引擎負責以下活動&負;
- Creation and management of request and response objects.
- Controlling and managing the CherryPy process.
CherryPy – Configuration
這個框架有自己的配置系統,允許您參數化HTTP伺服器。配置的設置可以存儲在語法接近INI格式的文本文件中,也可以存儲爲完整的Python字典。
要配置CherryPy伺服器實例,開發人員需要使用設置的全局部分。
global_conf = { 'global': { 'server.socket_host': 'localhost', 'server.socket_port': 8080, }, } application_conf = { '/style.css': { 'tools.staticfile.on': True, 'tools.staticfile.filename': os.path.join(_curdir, 'style.css'), } } This could be represented in a file like this: [global] server.socket_host = "localhost" server.socket_port = 8080 [/style.css] tools.staticfile.on = True tools.staticfile.filename = "/full/path/to.style.css"
HTTP Compliance
CherryPy的發展很緩慢,但它包括在HTTP/1.0的支持下編譯HTTP規範,隨後在HTTP/1.1的支持下傳輸。
CherryPy據說是有條件地符合HTTP/1.1的,因爲它實現了規範的所有必須和必需級別,但不是所有應該級別。因此,CherryPy支持HTTP/1.1的以下特性−
如果客戶端聲稱支持HTTP/1.1,它必須在使用指定協議版本發出的任何請求中發送頭欄位。如果不這樣做,CherryPy將立即停止處理請求。
CherryPy生成一個日期頭欄位,用於所有配置。
CherryPy可以在客戶機的支持下處理響應狀態代碼(100)。
CherryPy的內置HTTP伺服器通過使用Connection:Keep-Alive頭支持HTTP/1.1中默認的持久連接。
CherryPy處理正確的分塊請求和響應。
CherryPy以兩種不同的方式支持請求−If Modified Since和If Unmodified Since報頭,並相應地根據請求發送響應。
CherryPy允許任何HTTP方法。
CherryPy處理客戶端和伺服器設置之間的HTTP版本組合。
Multithreaded Application Server
CherryPy是基於多線程概念設計的。每次開發人員獲取或設置CherryPy名稱空間的值時,都是在多線程環境中完成的。
cherrypy.request和cherrypy.response都是線程數據容器,這意味著您的應用程式通過知道在運行時通過它們代理哪個請求來獨立調用它們。
使用線程模式的應用伺服器不被高度重視,因爲線程的使用被視爲增加了由於同步需求而出現問題的可能性。
其他的選擇包括&減;
Multi-process Pattern
每個請求都由其自己的Python進程處理。在這裡,伺服器的性能和穩定性可以被認爲是更好的。
Asynchronous Pattern
在這裡,接受新連接並將數據發送回客戶端是從請求進程異步完成的。這項技術以其效率而聞名。
URL Dispatching
CherryPy社區希望更加靈活,希望爲調度員提供其他解決方案。CherryPy 3提供了其他內置的調度器,並提供了一種編寫和使用自己的調度器的簡單方法。
- Applications used to develop HTTP methods. (GET, POST, PUT, etc.)
- The one which defines the routes in the URL – Routes Dispatcher
HTTP Method Dispatcher
在某些應用程式中,uri獨立於要由伺服器在資源上執行的操作。
例如,http://xyz.com/album/delete/10
URI包含客戶端希望執行的操作。
默認情況下,CherryPy dispatcher將按以下方式映射−
album.delete(12)
上面提到的調度器是正確的,但是可以通過以下方式使其獨立&負;
http://xyz.com/album/10
用戶可能想知道伺服器是如何發送精確的頁面的。此信息由HTTP請求本身攜帶。當有從客戶端到伺服器的請求時,CherryPy看起來是最合適的處理程序,該處理程序是URI目標資源的表示。
DELETE /album/12 HTTP/1.1
Routes Dispatcher
以下是分派中所需方法的參數列表−
name參數是要連接的路由的唯一名稱。
路由是匹配uri的模式。
控制器是包含頁處理程序的實例。
使用路由分派器連接與uri匹配的模式並關聯特定的頁處理程序。
Example
讓我們舉一個例子來了解它是如何工作的;
import random import string import cherrypy class StringMaker(object): @cherrypy.expose def index(self): return "Hello! How are you?" @cherrypy.expose def generate(self, length=9): return ''.join(random.sample(string.hexdigits, int(length))) if __name__ == '__main__': cherrypy.quickstart(StringMaker ())
按照下面給出的步驟獲得上述代碼的輸出;
第1步−將上述文件另存爲tutRoutes.py。
步驟2−訪問以下URL−
http://localhost:8080/generate?length=10
步驟3−您將收到以下輸出−