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())

以上代码将产生以下输出:

Error Handling

由于内置的访问工具,因此可以通过 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
广告

© . All rights reserved.