CherryPy - 网络服务


Web 服务是一组基于 Web 的组件,有助于在应用程序或系统之间交换数据,其中还包括开放协议和标准。它可以在网络上发布、使用和查找。

Web 服务有多种类型,例如 RWS(RESTfUL Web 服务)、WSDL、SOAP 等等。

REST — 代表性状态转移

一种远程访问协议,它将状态从客户端传输到服务器,可用于操纵状态而不是调用远程过程。

  • 不定义任何特定的编码或结构以及返回有用错误消息的方式。

  • 使用 HTTP“动词”来执行状态传输操作。

  • 资源使用 URL 进行唯一标识。

  • 它不是 API,而是 API 传输层。

REST 维护网络上资源的命名法,并提供统一的机制来对这些资源执行操作。每个资源由至少一个标识符来标识。如果 REST 基础设施是基于 HTTP 实现的,那么这些标识符被称为统一资源标识符 (URI)

以下是 URI 集的两个常见子集 -

子集 完整形式 例子
网址 统一资源定位器 http://www.gmail.com/
统一资源名称 瓮:isbn:0-201-71088-9 瓮: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.

检索资源元数据。

2.

得到

检索资源元数据和内容。

3.

邮政

请求服务器使用请求正文中包含的数据创建新资源。

4.

请求服务器将现有资源替换为请求正文中包含的资源。

5.

删除

请求服务器删除该 URI 标识的资源。

6.

选项

请求服务器返回有关全局或特定资源的功能的详细信息。

Atom 发布协议 (APP)

APP 源于 Atom 社区,作为 HTTP 之上的应用程序级协议,允许发布和编辑 Web 资源。APP 服务器和客户端之间的消息单元基于 Atom XML 文档格式。

Atom 发布协议使用 HTTP 及其机制以及 Atom XML 文档格式作为消息单元,定义了 APP 服务和用户代理之间的一组操作。

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方法 状态码 内容
取回 得到 200 代表资源的 Atom 条目
创造 邮政 201 通过 Location 和 Content-Location 标头新创建的资源的 URI
更新 200 代表资源的 Atom 条目
删除 删除 200 没有任何