- CherryPy 教程
- CherryPy - 首頁
- CherryPy - 簡介
- CherryPy - 環境設定
- CherryPy - 詞彙表
- 內建HTTP伺服器
- CherryPy - 工具箱
- CherryPy - 一個工作應用程式
- CherryPy - Web 服務
- CherryPy - 表示層
- CherryPy - Ajax 的使用
- CherryPy - 演示應用程式
- CherryPy - 測試
- 應用程式部署
- CherryPy 有用資源
- CherryPy - 快速指南
- CherryPy - 有用資源
- CherryPy - 討論
CherryPy - Web 服務
Web 服務是一組基於 Web 的元件,有助於應用程式或系統之間的資料交換,其中還包括開放協議和標準。它可以在 Web 上釋出、使用和查詢。
Web 服務有多種型別,例如 RWS(RESTful Web 服務)、WSDL、SOAP 等。
REST — 表述性狀態轉移
一種遠端訪問協議,它將狀態從客戶端傳輸到伺服器,可以用來操縱狀態,而不是呼叫遠端過程。
沒有定義任何特定的編碼或結構以及返回有用的錯誤訊息的方式。
使用 HTTP“動詞”執行狀態轉移操作。
資源使用 URL 唯一標識。
它不是 API,而是一個 API 傳輸層。
REST 保持網路上資源的命名法,並提供統一的機制來對這些資源執行操作。每個資源至少由一個識別符號標識。如果 REST 基礎設施是使用 HTTP 為基礎實現的,那麼這些識別符號被稱為統一資源識別符號 (URI)。
以下是 URI 集的兩個常見子集:
| 子集 | 全稱 | 示例 |
|---|---|---|
| URL | 統一資源定位符 | http://www.gmail.com/ |
| URN | 統一資源名稱 | urn:isbn:0-201-71088-9 urn:uuid:13e8cf26-2a25-11db-8693-000ae4ea7d46 |
在瞭解 CherryPy 架構的實現之前,讓我們先關注 CherryPy 的架構。
CherryPy 包括以下三個元件:
cherrypy.engine - 它控制程序啟動/終止和事件處理。
cherrypy.server - 它配置和控制 WSGI 或 HTTP 伺服器。
cherrypy.tools - 一組與處理 HTTP 請求正交的實用程式。
透過 CherryPy 的 REST 介面
RESTful Web 服務藉助以下內容實現 CherryPy 架構的每個部分:
- 身份驗證
- 授權
- 結構
- 封裝
- 錯誤處理
身份驗證
身份驗證有助於驗證我們正在與之互動的使用者。CherryPy 包括處理每種身份驗證方法的工具。
def authenticate():
if not hasattr(cherrypy.request, 'user') or cherrypy.request.user is None:
# < Do stuff to look up your users >
cherrypy.request.authorized = False # This only authenticates.
Authz must be handled separately.
cherrypy.request.unauthorized_reasons = []
cherrypy.request.authorization_queries = []
cherrypy.tools.authenticate = \
cherrypy.Tool('before_handler', authenticate, priority=10)
以上 authenticate() 函式將有助於驗證客戶端或使用者的存在。內建工具有助於以系統的方式完成此過程。
授權
授權有助於透過 URI 維持流程的完整性。此過程還有助於透過使用者令牌線索對物件進行變形。
def authorize_all():
cherrypy.request.authorized = 'authorize_all'
cherrypy.tools.authorize_all = cherrypy.Tool('before_handler', authorize_all, priority=11)
def is_authorized():
if not cherrypy.request.authorized:
raise cherrypy.HTTPError("403 Forbidden",
','.join(cherrypy.request.unauthorized_reasons))
cherrypy.tools.is_authorized = cherrypy.Tool('before_handler', is_authorized,
priority = 49)
cherrypy.config.update({
'tools.is_authorized.on': True,
'tools.authorize_all.on': True
})
授權的內建工具有助於以系統的方式處理例程,如前面的示例中所述。
結構
維護 API 的結構有助於減少對映應用程式 URI 的工作量。始終需要使 API 可發現且簡潔。CherryPy 框架的 API 基本結構應具有以下內容:
- 帳戶和使用者
- 自動響應器
- 聯絡方式
- 檔案
- 資料夾
- 列表和欄位
- 訊息和批處理
封裝
封裝有助於建立輕量級、人類可讀且可供各種客戶端訪問的 API。建立、檢索、更新和刪除的專案列表需要 API 的封裝。
錯誤處理
此過程管理錯誤(如果有),如果 API 在特定時刻無法執行。例如,400 表示錯誤請求,403 表示未授權請求。
示例
將以下內容視為資料庫、驗證或應用程式錯誤的示例。
import cherrypy
import json
def error_page_default(status, message, traceback, version):
ret = {
'status': status,
'version': version,
'message': [message],
'traceback': traceback
}
return json.dumps(ret)
class Root:
_cp_config = {'error_page.default': error_page_default}
@cherrypy.expose
def index(self):
raise cherrypy.HTTPError(500, "Internal Sever Error")
cherrypy.quickstart(Root())
以上程式碼將產生以下輸出:
由於內建的訪問工具,因此可以透過 CherryPy 輕鬆管理 API(應用程式程式設計介面)。
HTTP 方法
對資源進行操作的 HTTP 方法列表如下:
| 序號 | HTTP 方法和操作 |
|---|---|
| 1. | HEAD 檢索資源元資料。 |
| 2. | GET 檢索資源元資料和內容。 |
| 3. | POST 請求伺服器使用請求正文中包含的資料建立新資源。 |
| 4. | PUT 請求伺服器用請求正文中包含的資源替換現有資源。 |
| 5. | DELETE 請求伺服器刪除由該 URI 標識的資源。 |
| 6. | OPTIONS 請求伺服器返回有關功能的詳細資訊,無論是全域性的還是針對特定資源的。 |
Atom 釋出協議 (APP)
APP 誕生於 Atom 社群,是在 HTTP 之上的一種應用程式級協議,允許釋出和編輯 Web 資源。APP 伺服器和客戶端之間訊息的單位基於 Atom XML 文件格式。
Atom 釋出協議定義了 APP 服務和使用者代理之間使用 HTTP 及其機制以及 Atom XML 文件格式作為訊息單位的一組操作。
APP 首先定義服務文件,該文件為使用者代理提供 APP 服務提供的不同集合的 URI。
示例
讓我們舉一個例子來演示 APP 如何工作:
<?xml version = "1.0" encoding = "UTF-8"?>
<service xmlns = "http://purl.org/atom/app#" xmlns:atom = "http://www.w3.org/2005/Atom">
<workspace>
<collection href = "http://host/service/atompub/album/">
<atom:title> Albums</atom:title>
<categories fixed = "yes">
<atom:category term = "friends" />
</categories>
</collection>
<collection href = "http://host/service/atompub/film/">
<atom:title>Films</atom:title>
<accept>image/png,image/jpeg</accept>
</collection>
</workspace>
</service>
APP 指定了如何使用 HTTP 方法對集合的成員或集合本身執行基本的 CRUD 操作,如以下表格中所述:
| 操作 | HTTP 方法 | 狀態程式碼 | 內容 |
|---|---|---|---|
| 檢索 | GET | 200 | 表示資源的 Atom 條目 |
| 建立 | POST | 201 | 透過 Location 和 Content-Location 標頭提供的最新建立資源的 URI |
| 更新 | PUT | 200 | 表示資源的 Atom 條目 |
| 刪除 | DELETE | 200 | 無 |