Libreria di servizi remoti

Questo modulo contiene classi utili per la creazione di servizi remoti conformi a un modello standard di richiesta e risposta. Per essere conforme a questo modello, un servizio deve avere la seguente classe:

# 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 classe Service è una comoda classe base che fornisce le funzionalità riportate sopra. Implementa tutti i metodi obbligatori e facoltativi per un servizio. Offre inoltre metodi di convenienza per la creazione di funzioni di fabbrica che possono passare uno stato globale permanente a una nuova istanza di servizio.

Il decorator remoto viene utilizzato per dichiarare quali metodi di una classe sono destinati a gestire le RPC. Anche se questo decoratore non è responsabile della consegna dei socket e dei vari protocolli RPC sottostanti. Il decorator si assicura di utilizzare il tipo di richiesta corretto, ma non controlla l'inizializzazione.

Quando il decorator remoto viene utilizzato per un metodo, al metodo wrapper è associata una proprietà "remote". Questa proprietà contiene i valori request_type e response_type previsti dall'implementazione del metodo.

Di per sé, il decoratore da remoto non fornisce alcun supporto per i metodi secondari di sottoclasse. Per estendere un servizio, utilizza i metodi della sottoclasse per la decodifica. Ad esempio:

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