CherryPy - Servicios web

Un servicio web es un conjunto de componentes basados ​​en web que ayuda en el intercambio de datos entre la aplicación o los sistemas que también incluye protocolos y estándares abiertos. Se puede publicar, utilizar y encontrar en la web.

Los servicios web son de varios tipos como RWS (Servicio web RESTfUL), WSDL, SOAP y muchos más.

REST - Transferencia de estado representacional

Un tipo de protocolo de acceso remoto, que transfiere el estado del cliente al servidor que se puede utilizar para manipular el estado en lugar de llamar a procedimientos remotos.

  • No define ninguna codificación o estructura específica ni formas de devolver mensajes de error útiles.

  • Utiliza "verbos" HTTP para realizar operaciones de transferencia de estado.

  • Los recursos se identifican de forma única mediante URL.

  • No es una API, sino una capa de transporte de API.

REST mantiene la nomenclatura de los recursos en una red y proporciona un mecanismo unificado para realizar operaciones en estos recursos. Cada recurso está identificado por al menos un identificador. Si la infraestructura REST se implementa con la base de HTTP, estos identificadores se denominan comoUniform Resource Identifiers (URIs).

Los siguientes son los dos subconjuntos comunes del conjunto de URI:

Subconjunto Forma completa Ejemplo
URL Localizador Uniforme de Recursos http://www.gmail.com/
URNA Nombre de recurso uniforme urna: isbn: 0-201-71088-9 urna: uuid: 13e8cf26-2a25-11db-8693-000ae4ea7d46

Antes de comprender la implementación de la arquitectura CherryPy, centrémonos en la arquitectura de CherryPy.

CherryPy incluye los siguientes tres componentes:

  • cherrypy.engine - Controla el inicio / desmontaje del proceso y el manejo de eventos.

  • cherrypy.server - Configura y controla el servidor WSGI o HTTP.

  • cherrypy.tools - Una caja de herramientas de utilidades que son ortogonales para procesar una solicitud HTTP.

Interfaz REST a través de CherryPy

El servicio web RESTful implementa cada sección de la arquitectura CherryPy con la ayuda de lo siguiente:

  • Authentication
  • Authorization
  • Structure
  • Encapsulation
  • Manejo de errores

Autenticación

La autenticación ayuda a validar a los usuarios con los que estamos interactuando. CherryPy incluye herramientas para manejar cada método de autenticación.

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)

La función authenticate () ayudará a validar la existencia de los clientes o usuarios. Las herramientas integradas ayudan a completar el proceso de forma sistemática.

Autorización

La autorización ayuda a mantener la cordura del proceso a través de URI. El proceso también ayuda en la transformación de objetos mediante clientes potenciales de token de usuario.

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

Las herramientas integradas de autorización ayudan a manejar las rutinas de manera sistemática, como se mencionó en el ejemplo anterior.

Estructura

Mantener una estructura de API ayuda a reducir la carga de trabajo de mapear el URI de la aplicación. Siempre es necesario mantener la API visible y limpia. La estructura básica de API para el marco CherryPy debe tener lo siguiente:

  • Cuentas y usuario
  • Autoresponder
  • Contact
  • File
  • Folder
  • Lista y campo
  • Mensaje y lote

Encapsulamiento

La encapsulación ayuda a crear una API que sea liviana, legible por humanos y accesible para varios clientes. La lista de elementos junto con la creación, recuperación, actualización y eliminación requiere encapsulación de API.

Manejo de errores

Este proceso gestiona los errores, si los hay, si la API no se ejecuta según el instinto particular. Por ejemplo, 400 es para solicitud incorrecta y 403 es para solicitud no autorizada.

Ejemplo

Considere lo siguiente como un ejemplo de errores de base de datos, validación o aplicación.

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

El código anterior producirá el siguiente resultado:

La administración de API (Interfaz de programación de aplicaciones) es fácil a través de CherryPy debido a las herramientas de acceso integradas.

Métodos HTTP

La lista de métodos HTTP que operan en los recursos es la siguiente:

S. No Método y operación HTTP
1.

HEAD

Recupera los metadatos del recurso.

2.

GET

Recupera el contenido y los metadatos del recurso.

3.

POST

Solicita al servidor que cree un nuevo recurso utilizando los datos incluidos en el cuerpo de la solicitud.

4.

PUT

Solicita al servidor que reemplace un recurso existente por el incluido en el cuerpo de la solicitud.

5.

DELETE

Solicita al servidor que elimine el recurso identificado por ese URI.

6.

OPTIONS

Solicita al servidor que devuelva detalles sobre las capacidades de forma global o específica hacia un recurso.

Protocolo de publicación de Atom (APP)

APP ha surgido de la comunidad Atom como un protocolo de nivel de aplicación sobre HTTP para permitir la publicación y edición de recursos web. La unidad de mensajes entre un servidor de aplicaciones y un cliente se basa en el formato de documento Atom XML.

El Protocolo de publicación Atom define un conjunto de operaciones entre un servicio de APP y un agente de usuario que utiliza HTTP y sus mecanismos y el formato de documento XML de Atom como unidad de mensajes.

APP primero define un documento de servicio, que proporciona al agente de usuario el URI de las diferentes colecciones atendidas por el servicio APP.

Ejemplo

Tomemos un ejemplo para demostrar cómo funciona la aplicación:

<?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 especifica cómo realizar las operaciones CRUD básicas contra un miembro de una colección o la colección misma mediante el uso de métodos HTTP como se describe en la siguiente tabla:

Operación Método HTTP Código de estado Contenido
Recuperar OBTENER 200 Una entrada de Atom que representa el recurso
Crear ENVIAR 201 El URI del recurso recién creado a través de los encabezados Ubicación y Ubicación de contenido
Actualizar PONER 200 Una entrada de Atom que representa el recurso
Eliminar ELIMINAR 200 Ninguna