Este módulo contém classes úteis para construir serviços remotos que se adequam ao modelo de solicitação e resposta padrão. Para se adequar a esse modelo, um serviço precisa ser como a seguinte 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): ...
Service é uma classe básica prática que fornece a funcionalidade acima. Ela implementa todos os métodos obrigatórios e opcionais para um serviço. Ela também tem métodos de conveniência para criar funções de fábrica que podem passar estado global persistente para uma nova instância de serviço.
O decorador remoto é usado para declarar quais métodos de uma classe devem realizar o serviço de RPCs. Este decorador não é responsável por manipular soquetes e vários protocolos RPC subjacentes. Ele garante que você esteja usando o tipo de solicitação correto, mas não verifica a inicialização.
Quando o decorador remoto for usado em um método, o método wrapper terá uma propriedade "remota" associada. Essa propriedade contém o
request_type
e o response_type
esperados pela implementação do método.
Por si só, o decorador remoto não oferece suporte para subclasses de métodos remotos. Para estender um serviço, use os métodos de subclasse para redecorar. Exemplo:
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