20.24. SimpleXMLRPCServer —基本的なXML-RPCサーバー—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/2.7/library/simplexmlrpcserver
移動先:案内検索

20.24。 SimpleXMLRPCServer —基本的なXML-RPCサーバー

ノート

SimpleXMLRPCServer モジュールは、Python3のxmlrpc.serverにマージされました。 2to3 ツールは、ソースをPython 3に変換するときに、インポートを自動的に適応させます。


バージョン2.2の新機能。


ソースコード: :source: `Lib / SimpleXMLRPCServer.py`



SimpleXMLRPCServer モジュールは、Pythonで記述されたXML-RPCサーバー用の基本的なサーバーフレームワークを提供します。 サーバーは、 SimpleXMLRPCServer を使用して自立型にすることも、 CGIXMLRPCRequestHandler を使用してCGI環境に組み込むこともできます。

class SimpleXMLRPCServer.SimpleXMLRPCServer(addr[, requestHandler[, logRequests[, allow_none[, encoding[, bind_and_activate]]]])

新しいサーバーインスタンスを作成します。 このクラスは、XML-RPCプロトコルで呼び出すことができる関数を登録するためのメソッドを提供します。 requestHandler パラメーターは、リクエストハンドラインスタンスのファクトリである必要があります。 デフォルトは SimpleXMLRPCRequestHandler です。 addr および requestHandler パラメーターは、 SocketServer.TCPServer コンストラクターに渡されます。 logRequests がtrue(デフォルト)の場合、リクエストはログに記録されます。 このパラメータをfalseに設定すると、ロギングがオフになります。 allow_none および encoding パラメーターは xmlrpclib に渡され、サーバーから返されるXML-RPC応答を制御します。 bind_and_activate パラメーターは、server_bind()およびserver_activate()がコンストラクターによってすぐに呼び出されるかどうかを制御します。 デフォルトはtrueです。 falseに設定すると、コードは、アドレスがバインドされる前に allow_reuse_address クラス変数を操作できます。

バージョン2.5で変更: allow_none および encoding パラメーターが追加されました。

バージョン2.6で変更: bind_and_activate パラメーターが追加されました。

class SimpleXMLRPCServer.CGIXMLRPCRequestHandler([allow_none[, encoding]])

CGI環境でXML-RPC要求を処理するための新しいインスタンスを作成します。 allow_none および encoding パラメーターは xmlrpclib に渡され、サーバーから返されるXML-RPC応答を制御します。

バージョン2.3の新機能。

バージョン2.5で変更: allow_none および encoding パラメーターが追加されました。

class SimpleXMLRPCServer.SimpleXMLRPCRequestHandler
新しいリクエストハンドラインスタンスを作成します。 このリクエストハンドラーはPOSTリクエストをサポートし、 logRequests パラメーターから SimpleXMLRPCServer コンストラクターパラメーターが尊重されるようにログを変更します。

20.24.1。 SimpleXMLRPCServerオブジェクト

SimpleXMLRPCServer クラスは、 SocketServer.TCPServer に基づいており、シンプルなスタンドアロンXML-RPCサーバーを作成する手段を提供します。

SimpleXMLRPCServer.register_function(function[, name])
XML-RPC要求に応答できる関数を登録します。 name を指定すると、 function に関連付けられたメソッド名になります。指定しない場合は、function.__name__が使用されます。 name は、通常の文字列またはUnicode文字列のいずれかであり、ピリオド文字など、Python識別子で無効な文字を含めることができます。
SimpleXMLRPCServer.register_instance(instance[, allow_dotted_names])

register_function()を使用して登録されていないメソッド名を公開するために使用されるオブジェクトを登録します。 instance_dispatch()メソッドが含まれている場合、要求されたメソッド名と要求からのパラメーターを使用して呼び出されます。 そのAPIはdef _dispatch(self, method, params)です( params は可変引数リストを表していないことに注意してください)。 基になる関数を呼び出してタスクを実行する場合、その関数はfunc(*params)として呼び出され、パラメーターリストが展開されます。 その結果、_dispatch()からの戻り値がクライアントに返されます。 instance_dispatch()メソッドがない場合は、要求されたメソッドの名前に一致する属性が検索されます。

オプションの allow_dotted_names 引数がtrueで、インスタンスに_dispatch()メソッドがない場合、要求されたメソッド名にピリオドが含まれていると、メソッド名の各コンポーネントが個別に検索されます。単純な階層検索が実行される効果。 この検索で見つかった値は、リクエストのパラメータを使用して呼び出され、戻り値がクライアントに返されます。

警告

allow_dotted_names オプションを有効にすると、侵入者がモジュールのグローバル変数にアクセスできるようになり、侵入者がマシン上で任意のコードを実行できる可能性があります。 このオプションは、安全で閉じたネットワークでのみ使用してください。

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

SimpleXMLRPCServer.register_introspection_functions()

XML-RPCイントロスペクション関数system.listMethodssystem.methodHelp、およびsystem.methodSignatureを登録します。

バージョン2.3の新機能。

SimpleXMLRPCServer.register_multicall_functions()
XML-RPCマルチコール関数system.multicallを登録します。
SimpleXMLRPCRequestHandler.rpc_paths

XML-RPC要求を受信するためのURLの有効なパス部分をリストするタプルでなければならない属性値。 他のパスに投稿されたリクエストは、404「そのようなページはありません」HTTPエラーになります。 このタプルが空の場合、すべてのパスが有効であると見なされます。 デフォルト値は('/', '/RPC2')です。

バージョン2.5の新機能。

SimpleXMLRPCRequestHandler.encode_threshold

この属性がNoneでない場合、この値より大きい応答は、クライアントによって許可されている場合、 gzip 転送エンコーディングを使用してエンコードされます。 デフォルトは1400で、これはおおよそ単一のTCPパケットに対応します。

バージョン2.7の新機能。

20.24.1.1。 SimpleXMLRPCServerの例

サーバーコード:

from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler

# Restrict to a particular path.
class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ('/RPC2',)

# Create server
server = SimpleXMLRPCServer(("localhost", 8000),
                            requestHandler=RequestHandler)
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.ServerProxy('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()

次の SimpleXMLRPCServer の例は、モジュール Lib / SimpleXMLRPCServer.py に含まれています。

server = SimpleXMLRPCServer(("localhost", 8000))
server.register_function(pow)
server.register_function(lambda x,y: x+y, 'add')
server.register_multicall_functions()
server.serve_forever()

このデモサーバーは、コマンドラインから次のように実行できます。

python -m SimpleXMLRPCServer

上記のサーバーと通信するクライアントコードの例は、 Lib / xmlrpclib.py に含まれています。

server = ServerProxy("http://localhost:8000")
print server
multi = MultiCall(server)
multi.pow(2, 9)
multi.add(5, 1)
multi.add(24, 11)
try:
    for response in multi():
        print response
except Error, v:
    print "ERROR", v

また、クライアントは次のコマンドを使用して直接呼び出すことができます。

python -m xmlrpclib

20.24.2。 CGIXMLRPCRequestHandler

CGIXMLRPCRequestHandler クラスは、PythonCGIスクリプトに送信されるXML-RPC要求を処理するために使用できます。

CGIXMLRPCRequestHandler.register_function(function[, name])
XML-RPC要求に応答できる関数を登録します。 name が指定されている場合は、関数に関連付けられているメソッド名になります。指定されていない場合は、 function .__ name __ が使用されます。 name は、通常の文字列またはUnicode文字列のいずれかであり、ピリオド文字など、Python識別子で無効な文字を含めることができます。
CGIXMLRPCRequestHandler.register_instance(instance)
register_function()を使用して登録されていないメソッド名を公開するために使用されるオブジェクトを登録します。 インスタンスに_dispatch()メソッドが含まれている場合、インスタンスは要求されたメソッド名と要求からのパラメーターを使用して呼び出されます。 その結果、戻り値がクライアントに返されます。 インスタンスに_dispatch()メソッドがない場合は、要求されたメソッドの名前に一致する属性が検索されます。 要求されたメソッド名にピリオドが含まれている場合、メソッド名の各コンポーネントが個別に検索され、単純な階層検索が実行されます。 この検索で見つかった値は、リクエストのパラメータを使用して呼び出され、戻り値がクライアントに返されます。
CGIXMLRPCRequestHandler.register_introspection_functions()
XML-RPCイントロスペクション関数system.listMethodssystem.methodHelpsystem.methodSignatureを登録します。
CGIXMLRPCRequestHandler.register_multicall_functions()
XML-RPCマルチコール関数system.multicallを登録します。
CGIXMLRPCRequestHandler.handle_request([request_text = None])
XML-RPCリクエストを処理します。 request_text が指定されている場合、それはHTTPサーバーによって提供されたPOSTデータである必要があります。指定されていない場合、stdinのコンテンツが使用されます。

例:

class MyFuncs:
    def div(self, x, y): return x // y


handler = CGIXMLRPCRequestHandler()
handler.register_function(pow)
handler.register_function(lambda x,y: x+y, 'add')
handler.register_introspection_functions()
handler.register_instance(MyFuncs())
handler.handle_request()