Cherrypy - 內建 Http 伺服器和內部引擎

CherryPy 自帶 Web(HTTP) 伺服器。這就是為什麼 CherryPy 是自包含的,允許使用者在獲取庫的幾分鐘內執行 CherryPy 應用程式。

Web 伺服器充當閘道器與所有的請求和響應都保持在軌道上的幫助應用程式。

要啟動 Web 伺服器,使用者必須進行以下呼叫 -

cherryPy.server.quickstart()

CherryPy內部引擎負責以下活動 -

  • 建立和管理請求和響應物件。
  • 控制和管理 CherryPy 流程。

CherryPy - 配置

該框架帶有自己的配置系統,允許你引數化 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 合規性

CherryPy 一直在發展緩慢,但它包括 HTTP 規範的編譯,HTTP / 1.0 的支援隨後在 HTTP / 1.1 的支援下傳輸。

據說 CherryPy 有條件地符合 HTTP / 1.1,因為它實現了所有必需和必需的級別,但不是規範的所有應該級別。因此,CherryPy 支援 HTTP / 1.1 的以下功能 -

  • 如果客戶端聲稱支援 HTTP/1.1,則它必須在使用指定協議版本的任何請求中傳送頭欄位。如果沒有完成,CherryPy 將立即停止處理請求。

  • CherryPy 生成一個 Date 頭欄位,用於所有配置。

  • CherryPy 可以在客戶的支援下處理響應狀態程式碼(100)。

  • CherryPy 的內建 HTTP 伺服器通過使用 Connection:Keep-Alive 標頭支援 HTTP / 1.1 中的預設持久連線。

  • CherryPy 正確處理分塊請求和響應。

  • CherryPy 以兩種不同的方式支援請求 - If-Modified-Since 和 If-Unmodified- Since headers 並根據請求相應地傳送響應。

  • CherryPy 允許任何 HTTP 方法。

  • CherryPy 處理客戶端和伺服器設定集之間的 HTTP 版本組合。

多執行緒應用程式伺服器

CherryPy 是基於多執行緒概念設計的。每次開發人員在 CherryPy 名稱空間中獲取或設定值時,都會在多執行緒環境中完成。

cherrypy.requestcherrypy.response 都是執行緒資料容器,這意味著你的應用程式通過知道在執行時通過它們代理哪個請求來獨立地呼叫它們。

使用執行緒模式的應用程式伺服器不被高度重視,因為執行緒的使用被視為增加了由於同步要求而導致問題的可能性。

其他選擇包括 -

多程序模式

每個請求都由自己的 Python 程序處理。在這裡,可以認為伺服器的效能和穩定性更好。

非同步模式

在這裡,接受新連線並將資料傳送回客戶端是從請求過程非同步完成的。該技術以其效率而著稱。

URL 排程

CherryPy 社群希望更靈活,並且感謝排程程式的其他解決方案。CherryPy 3 提供了其他內建排程程式,並提供了一種編寫和使用自己的排程程式的簡單方法。

  • 用於開發 HTTP 方法的應用程式。 (GET,POST,PUT 等)
  • 定義 URL 中路由的路由 - 路由排程程式

HTTP 方法排程程式

在某些應用程式中,URI 與操作無關,操作由資源上的伺服器執行。

例如, http://xyz.com/album/delete/10

URI 包含客戶端希望執行的操作。

預設情況下,CherryPy 排程程式將以下列方式對映 -

album.delete(12)

上面提到的排程程式是正確提到的,但可以通過以下方式獨立 -

http://xyz.com/album/10

使用者可能想知道伺服器如何排程確切的頁面。此資訊由 HTTP 請求本身承載。當有來自客戶端到伺服器的請求時,CherryPy 看起來是最合適的處理程式,處理程式是 URI 所針對的資源的表示。

DELETE /album/12 HTTP/1.1

路由排程器

以下是排程所需方法的引數列表 -

  • name 引數是要連線的路由的唯一名稱。

  • 路由是匹配 URI 的模式。

  • 控制器是包含頁面處理程式的例項。

  • 使用 Routes 排程程式連線與 URI 匹配的模式並關聯特定的頁面處理程式。

讓我們舉一個例子來了解它是如何工作的 -

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 - 訪問以下網址 -

http://localhost:8080/generate?length=10

步驟 3 - 你將看到以下輸出 -

路由排程器