Biblioteca de servicios remotos

Este módulo contiene clases de utilidad para crear servicios remotos que se ajusten a una solicitud estándar y a un modelo de respuesta. Para ajustarse a este modelo, un servicio debe ser como la siguiente clase:

# Each service instance only handles a single request and is then discarded.
# Make these objects light weight.
class Service(object):

    # It must be possible to construct service objects without any parameters.
    # If your constructor needs extra information you should provide a
    # no-argument factory function to create service instances.
    def __init__(self):
        ...

    # Each remote method must use the 'remote' decorator, passing the request
    # and response message types.  The remote method itself must take a single
    # parameter which is an instance of RequestMessage and return an instance
    # of ResponseMessage.
    @method(RequestMessage, ResponseMessage)
    def remote_method(self, request):
        # Return an instance of ResponseMessage.

    # A service object may optionally implement a 'initialize_request_state'
    # method that takes as a parameter a single instance of a RequestState.  If
    # a service does not implement this method it will not receive the request
    # state.
    def initialize_request_state(self, state):
        ...

La clase Service es una clase base práctica que proporciona las funciones anteriores. Implementa todos los métodos obligatorios y opcionales de un servicio. También incluye métodos de conveniencia para crear funciones de fábrica que puedan transmitir estados globales persistentes a una nueva instancia del servicio.

El decorador remoto se utiliza para declarar qué métodos de una clase sirven para realizar llamadas de procedimiento remotas (RPC). Aunque este decorador no se encarga de proporcionar sockets y varios protocolos RPC subyacentes. El decorador se asegura de que estés utilizando el tipo de solicitud correcto, pero no comprueba la inicialización.

Cuando se usa el decorador remoto en un método, el método de envoltorio tendrá una propiedad "remote" asociada. Esta propiedad contiene los valores request_type y response_type que espera la implementación del método.

Por sí solo, el decorador remoto no ofrece ninguna compatibilidad con las subclases de métodos remotos. A fin de ampliar un servicio, utiliza los métodos de subclase para volver a decorar. Por ejemplo:

class MyService(Service):

    @method(DoSomethingRequest, DoSomethingResponse)
    def do_something(self, request):
        ... implement do-something ...

class MyBetterService(MyService):

    @method(DoSomethingRequest, DoSomethingResponse)
    def do_something(self, request):
        response = super(MyBetterService, self).do_something.remote.method(request)
        ... do something with response ...
        return response