內建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 伺服器支援持久連線,這是 HTTP/1.1 中的預設設定,透過使用 Connection: Keep-Alive 標頭實現。

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

  • CherryPy 透過兩種不同的方式處理請求:If-Modified-Since 和 If-Unmodified-Since 標頭,並根據請求相應地傳送響應。

  • CherryPy 允許任何 HTTP 方法。

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

多執行緒應用程式伺服器

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

cherrypy.request 和 cherrypy.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 引數是連線路由的唯一名稱。

  • route 是匹配 URI 的模式。

  • controller 是包含頁面處理程式的例項。

  • 使用路由分發器連線匹配 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 - 訪問以下 URL:

https://:8080/generate?length=10

步驟 3 - 您將收到以下輸出:

Routes Dispatcher
廣告
© . All rights reserved.