CherryPy - Web服务

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

Web服务有各种类型,如RWS(RESTfUL Web服务),WSDL,SOAP等等.

REST  - 具象状态转移

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

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

  • 使用HTTP"动词"执行状态转移操作.

  • 使用URL唯一标识资源.

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

REST维护网络上资源的命名,并提供统一的机制来对这些资源执行操作.每个资源由至少一个标识符标识.如果REST基础结构是以HTTP为基础实现的,则这些标识符称为统一资源标识符(URI).

以下是两个常见子集URI set :

子集完整格式示例
URL统一资源定位器http://www.gmail.com/
URN统一资源名称urn:isbn:0-201-71088-9
urn:uuid:13e8cf26-2a25-11db-8693-000ae4ea7d46

在了解CherryPy架构的实现之前,让我们关注CherryPy的架构.

CherryPy包含以下内容三个组成部分 :

  • cherrypy.engine &minu S;它控制流程启动/拆卸和事件处理.

  • 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结构有助于减少mappin的工作量g应用程序的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())

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

错误处理

API管理(应用程序编程接口)很容易通过CherryPy,因为内置的访问工具.

HTTP方法

操作的HTTP方法列表资源如下 :

Atom发布协议(APP)

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

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

APP首先定义一个服务文档,它为用户代理提供服务的不同集合的URI. APP服务.

示例

APP指定如何使用HTTP方法对集合成员或集合本身执行基本CRUD操作,如下表所示 :

S.NoHTTP方法&操作
1.

HEAD

检索资源元数据.

2.

获取

检索资源元数据和内容.

3.

POST

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

4.

PUT

请求服务器更换包含在请求正文中的现有资源.

5.

DELETE

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

6.

选项

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

Atom Publishing Protocol (APP)

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

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

APP首先定义服务文档,该服务文档向用户代理提供APP服务所服务的不同集合的URI。

Example

让我们举一个例子来说明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操作,如下表所示:

OperationHTTP MethodStatus CodeContent
RetrieveGET200An Atom entry representing the resource
CreatePOST201The URI of the newly created resource via the Location and Content-Location headers
UpdatePUT200An Atom entry representing the resource
DeleteDELETE200None