リモート サービス ライブラリ

このモジュールには、リクエストとレスポンスの標準モデルに準拠したリモート サービスの構築に役立つクラスが含まれています。このモデルに準拠するには、サービスが次のようなクラスでなければなりません。

# 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 クラスは、上記の機能を提供する便利な基本クラスです。サービスに使用するすべての必須メソッドとオプションのメソッドを実装します。また、新しいサービス インスタンスに、グローバルで永続的な状態を渡すファクトリ関数を作成するためのコンビニエンス メソッドがあります。

リモート デコレータは、クラスのどのメソッドが RPC を処理するためのメソッドであるかを宣言するために使用します。ただし、このデコレータでは、ソケットや基となるさまざまな RPC プロトコルの処理は行いません。デコレータを使用すると、正しいリクエスト タイプを使用していることは確認できますが、初期化のチェックは行われません。

リモート デコレータをメソッドで使用する場合、ラッパー メソッドに「remote」プロパティが関連付けられます。このプロパティには、メソッドの実装に必要な request_typeresponse_type が含まれています。

リモート デコレータ自体には、リモート メソッドをサブクラス化する機能はありません。サービスを拡張するためには、サブクラス メソッドを使用して再修飾します。次に例を示します。

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