La libreria di servizi remoti

Questo modulo contiene classi utili per creare servizi remoti conformi a un modello standard di richiesta e risposta. 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 comoda classe di base che fornisce la funzionalità sopra descritta. Implementa tutti i metodi obbligatori e facoltativi per un servizio. Dispone inoltre di metodi di utilità per la creazione di funzioni di fabbrica che possono passare lo stato globale persistente a una nuova istanza di servizio.

Il decoratore 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 decoratore garantisce che tu stia utilizzando il tipo di richiesta corretto, ma non controlla l'inizializzazione.

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

Il decoratore remoto da solo non fornisce alcun supporto per la sottoclassificazione metodi remoti. Per estendere un servizio, utilizza i metodi della sottoclasse per ridecorare. 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