La libreria di servizi remoti

Questo modulo contiene classi utili per creare servizi remoti conformi a un modello di richiesta e risposta standard. Per essere conforme a questo modello, un servizio deve essere simile alla 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 pratica classe base che fornisce la funzionalità descritta sopra. Implementa tutti i metodi obbligatori e facoltativi per un servizio. Dispone anche di metodi pratici 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. Tuttavia, questo decoratore non è responsabile della gestione delle socket e dei vari protocolli RPC sottostanti. Il decorator si assicura di utilizzare il tipo di richiesta corretto, ma non verifica l'inizializzazione.

Quando il decoratore remoto viene utilizzato in un metodo, al metodo wrapper verrà associata una proprietà "remote". Questa proprietà contiene il parametro request_type e response_type previsti dall'implementazione del metodo.

Il decoratore remoto non fornisce alcun supporto per la creazione di sottoclassi da metodi remoti. Al fine di estendere un servizio, utilizza i metodi delle sottoclassi per ridisegnare. 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