18.25.1 SimpleXMLRPCServer オブジェクト

SimpleXMLRPCServer クラスは SocketServer.TCPServer のサブクラスで、基本的なスタンドアロンの XML-RPC サーバーを作成する手段を提供します。

register_function( function[, name])
XML-RPCリクエストに応じる関数を登録します。引数nameが与えられている場合はその値が、関数functionに関連付けられます。これが与えられない場合はfunction.__name__の値が用いられます。引数nameは通常の文字列でもユニコード文字列でも良く、Pythonで識別子として正しくない文字(" . "ピリオドなど )を含んでいても。

register_instance( instance[, allow_dotted_names])

オブジェクトを登録し、そのオブジェクトのregister_function()で 登録されていないメソッドを公開します。もし、instanceがメソッド _dispatch()を定義していれば、_dispatch()が、リクエス トされたメソッド名とパラメータの組を引数として呼び出されます。そして、 _dispatch()の返り値が結果としてクライアントに返されます。 そのAPIは def _dispatch(self, method, params) (注意: paramsは可変引数リストではありません)です。仕事をするため に下位の関数を呼ぶ時には、その関数はfunc(*params)のように呼ばれ ます。_dispatch()の返り値はクライアントへ結果として返されます。 もし、 instanceがメソッド_dispatch()を定義していなければ、リク エストされたメソッド名がそのインスタンスに定義されているメソッド名から 探されます。

もしオプション引数allow_dotted_namesが真(true)で、 インスタンスがメソッド_dispatch()を定義していないとき、 リクエストされたメソッド名がピリオドを含む場合は、(訳注: 通常のPythonでのピリオドの解釈と同様に)階層的にオブジェクトを探索し ます。そして、そこで見つかったオブジェクトをリクエストから渡された引数 で呼び出し、その返り値をクライアントに返します。

警告: allow_dotted_namesオプションを有効にすると、侵入者にあなたのモジュールの グローバル変数にアクセスすることを許し、あなたのコンピュータで任意のコードを実行する ことを許すことがあります。このオプションは安全な閉じたネットワークでのみお使い下さい。

バージョン 2.3.5, 2.4.1 で 変更 された仕様: allow_dotted_names はセキュリティホールを塞ぐた めに追加されました。以前のバージョンは安全ではありません

register_introspection_functions( )
XML-RPC のイントロスペクション関数、system.listMethodssystem.methodHelpsystem.methodSignature を登録します。 バージョン 2.3 で 新たに追加 された仕様です。

register_multicall_functions( )
XML-RPC における複数の要求を処理する関数 system.multicall を登録します。

rpc_paths
この属性値はXML-RPCリクエストを受け付けるURLの正当なパス部分をリストするタプルで なければなりません。これ以外のパスへのリクエストは404「そのようなページはありません」 HTTPエラーになります。このタプルが空の場合は全てのパスが正当であると見なされます。 デフォルト値は('/', '/RPC2')です。 バージョン 2.5 で 新たに追加 された仕様です。

以下に例を示します。

from SimpleXMLRPCServer import SimpleXMLRPCServer

# Create server
server = SimpleXMLRPCServer(("localhost", 8000))
server.register_introspection_functions()

# Register pow() function; this will use the value of 
# pow.__name__ as the name, which is just 'pow'.
server.register_function(pow)

# Register a function under a different name
def adder_function(x,y):
    return x + y
server.register_function(adder_function, 'add')

# Register an instance; all the methods of the instance are 
# published as XML-RPC methods (in this case, just 'div').
class MyFuncs:
    def div(self, x, y): 
        return x // y
    
server.register_instance(MyFuncs())

# Run the server's main loop
server.serve_forever()

以下のクライアントコードは上のサーバーで使えるようになったメソッドを呼び出します:

import xmlrpclib

s = xmlrpclib.Server('http://localhost:8000')
print s.pow(2,3)  # Returns 2**3 = 8
print s.add(2,3)  # Returns 5
print s.div(5,2)  # Returns 5//2 = 2

# Print list of available methods
print s.system.listMethods()

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。