La biblioteca de servicios remotos

Este módulo contiene clases que son útiles para compilar servicios remotos que coinciden con una solicitud estándar y un modelo de respuesta. Para coincidir con este modelo, un servicio debe ser como la clase siguiente:

# 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 base conveniente que proporciona la funcionalidad anterior. Implementa todos los métodos obligatorios y opcionales para un servicio. También tiene métodos de conveniencia para crear funciones de fábrica que pueden pasar el estado global persistente a una instancia de servicio nueva.

El decorador remoto se usa para declarar qué métodos de una clase están destinados a entregar RPC. Si bien este decorador no es responsable de entregar sockets y varios protocolos de RPC subyacentes. El decorador se asegura de que uses el tipo de solicitud correcto, pero no verifica la inicialización.

Cuando el decorador remoto se usa en un método, el método wrapper tendrá una propiedad "remota" asociada a él. Esta propiedad contiene los request_type y response_type esperados por la implementación del método.

Por sí mismo, el decorador remoto no proporciona ninguna asistencia para los métodos remotos de subclase. Con el fin de extender un servicio, usa los métodos de subclase para redecorar. 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