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

提供:Dev Guides
< PythonPython/docs/3.8/library/xmlrpc.server
移動先:案内検索

xmlrpc.server —基本的なXML-RPCサーバー

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



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

警告

xmlrpc.server モジュールは、悪意を持って構築されたデータに対して安全ではありません。 信頼できないデータまたは認証されていないデータを解析する必要がある場合は、 XMLの脆弱性を参照してください。


class xmlrpc.server.SimpleXMLRPCServer(addr, requestHandler=SimpleXMLRPCRequestHandler, logRequests=True, allow_none=False, encoding=None, bind_and_activate=True, use_builtin_types=False)

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

バージョン3.3で変更: use_builtin_types フラグが追加されました。

class xmlrpc.server.CGIXMLRPCRequestHandler(allow_none=False, encoding=None, use_builtin_types=False)

CGI環境でXML-RPC要求を処理するための新しいインスタンスを作成します。 allow_none および encoding パラメーターは xmlrpc.client に渡され、サーバーから返されるXML-RPC応答を制御します。 use_builtin_types パラメーターは loads()関数に渡され、日付/時刻値またはバイナリデータを受信したときに処理されるタイプを制御します。 デフォルトはfalseです。

バージョン3.3で変更: use_builtin_types フラグが追加されました。

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

SimpleXMLRPCServerオブジェクト

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

SimpleXMLRPCServer.register_function(function=None, name=None)

XML-RPC要求に応答できる関数を登録します。 name を指定すると、 function に関連付けられたメソッド名になります。指定しない場合は、function.__name__が使用されます。 name は文字列であり、ピリオド文字など、Python識別子で無効な文字が含まれている場合があります。

このメソッドは、デコレータとしても使用できます。 デコレータとして使用する場合、 name は、 name の下に function を登録するためのキーワード引数としてのみ指定できます。 name が指定されていない場合、function.__name__が使用されます。

バージョン3.7で変更: register_function()をデコレータとして使用できます。

SimpleXMLRPCServer.register_instance(instance, allow_dotted_names=False)

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

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

警告

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

SimpleXMLRPCServer.register_introspection_functions()
XML-RPCイントロスペクション関数system.listMethodssystem.methodHelpsystem.methodSignatureを登録します。
SimpleXMLRPCServer.register_multicall_functions()
XML-RPCマルチコール関数system.multicallを登録します。
SimpleXMLRPCRequestHandler.rpc_paths
XML-RPC要求を受信するためのURLの有効なパス部分をリストするタプルでなければならない属性値。 他のパスに投稿されたリクエストは、404「そのようなページはありません」HTTPエラーになります。 このタプルが空の場合、すべてのパスが有効であると見なされます。 デフォルト値は('/', '/RPC2')です。

SimpleXMLRPCServerの例

サーバーコード:

from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.server import SimpleXMLRPCRequestHandler

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

# Create server
with SimpleXMLRPCServer(('localhost', 8000),
                        requestHandler=RequestHandler) as server:
    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 'mul').
    class MyFuncs:
        def mul(self, x, y):
            return x * y

    server.register_instance(MyFuncs())

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

次のクライアントコードは、前のサーバーによって使用可能になったメソッドを呼び出します。

import xmlrpc.client

s = xmlrpc.client.ServerProxy('http://localhost:8000')
print(s.pow(2,3))  # Returns 2**3 = 8
print(s.add(2,3))  # Returns 5
print(s.mul(5,2))  # Returns 5*2 = 10

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

register_function()はデコレータとしても使用できます。 前のサーバーの例では、デコレータの方法で関数を登録できます。

from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.server import SimpleXMLRPCRequestHandler

class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ('/RPC2',)

with SimpleXMLRPCServer(('localhost', 8000),
                        requestHandler=RequestHandler) as server:
    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, using
    # register_function as a decorator. *name* can only be given
    # as a keyword argument.
    @server.register_function(name='add')
    def adder_function(x, y):
        return x + y

    # Register a function under function.__name__.
    @server.register_function
    def mul(x, y):
        return x * y

    server.serve_forever()

Lib/xmlrpc/server.pyモジュールに含まれる次の例は、ドット名を許可し、マルチコール関数を登録するサーバーを示しています。

警告

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


import datetime

class ExampleService:
    def getData(self):
        return '42'

    class currentTime:
        @staticmethod
        def getCurrentTime():
            return datetime.datetime.now()

with SimpleXMLRPCServer(("localhost", 8000)) as server:
    server.register_function(pow)
    server.register_function(lambda x,y: x+y, 'add')
    server.register_instance(ExampleService(), allow_dotted_names=True)
    server.register_multicall_functions()
    print('Serving XML-RPC on localhost port 8000')
    try:
        server.serve_forever()
    except KeyboardInterrupt:
        print("\nKeyboard interrupt received, exiting.")
        sys.exit(0)

このExampleServiceデモは、コマンドラインから呼び出すことができます。

python -m xmlrpc.server

上記のサーバーと対話するクライアントは、 Lib / xmlrpc / client.py に含まれています。

server = ServerProxy("http://localhost:8000")

try:
    print(server.currentTime.getCurrentTime())
except Error as v:
    print("ERROR", v)

multi = MultiCall(server)
multi.getData()
multi.pow(2,9)
multi.add(1,2)
try:
    for response in multi():
        print(response)
except Error as v:
    print("ERROR", v)

デモXMLRPCサーバーと対話するこのクライアントは、次のように呼び出すことができます。

python -m xmlrpc.client

CGIXMLRPCRequestHandler

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

CGIXMLRPCRequestHandler.register_function(function=None, name=None)

XML-RPC要求に応答できる関数を登録します。 name を指定すると、 function に関連付けられたメソッド名になります。指定しない場合は、function.__name__が使用されます。 name は文字列であり、ピリオド文字など、Python識別子で無効な文字が含まれている場合があります。

このメソッドは、デコレータとしても使用できます。 デコレータとして使用する場合、 name は、 name の下に function を登録するためのキーワード引数としてのみ指定できます。 name が指定されていない場合、function.__name__が使用されます。

バージョン3.7で変更: register_function()をデコレータとして使用できます。

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 mul(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()

XMLRPCサーバーの文書化

これらのクラスは、上記のクラスを拡張して、HTTPGET要求に応答してHTMLドキュメントを提供します。 サーバーは、 DocXMLRPCServer を使用して自立型にすることも、 DocCGIXMLRPCRequestHandler を使用してCGI環境に組み込むこともできます。

class xmlrpc.server.DocXMLRPCServer(addr, requestHandler=DocXMLRPCRequestHandler, logRequests=True, allow_none=False, encoding=None, bind_and_activate=True, use_builtin_types=True)

新しいサーバーインスタンスを作成します。 すべてのパラメーターは、 SimpleXMLRPCServer の場合と同じ意味を持ちます。 requestHandler のデフォルトは DocXMLRPCRequestHandler です。

バージョン3.3で変更: use_builtin_types フラグが追加されました。

class xmlrpc.server.DocCGIXMLRPCRequestHandler
CGI環境でXML-RPC要求を処理するための新しいインスタンスを作成します。
class xmlrpc.server.DocXMLRPCRequestHandler
新しいリクエストハンドラインスタンスを作成します。 このリクエストハンドラーは、XML-RPC POSTリクエスト、ドキュメントGETリクエストをサポートし、 logRequests パラメーターから DocXMLRPCServer コンストラクターパラメーターが尊重されるようにログを変更します。


DocXMLRPCServerオブジェクト

DocXMLRPCServer クラスは、 SimpleXMLRPCServer から派生し、自己文書化されたスタンドアロンXML-RPCサーバーを作成する手段を提供します。 HTTP POSTリクエストは、XML-RPCメソッド呼び出しとして処理されます。 HTTP GETリクエストは、pydocスタイルのHTMLドキュメントを生成することによって処理されます。 これにより、サーバーは独自のWebベースのドキュメントを提供できます。

DocXMLRPCServer.set_server_title(server_title)
生成されたHTMLドキュメントで使用されるタイトルを設定します。 このタイトルは、HTMLの「title」要素内で使用されます。
DocXMLRPCServer.set_server_name(server_name)
生成されたHTMLドキュメントで使用される名前を設定します。 この名前は、生成されたドキュメントの上部の「h1」要素内に表示されます。
DocXMLRPCServer.set_server_documentation(server_documentation)
生成されたHTMLドキュメントで使用される説明を設定します。 この説明は、ドキュメントのサーバー名の下に段落として表示されます。


DocCGIXMLRPCRequestHandler

DocCGIXMLRPCRequestHandler クラスは CGIXMLRPCRequestHandler から派生し、自己文書化されたXML-RPCCGIスクリプトを作成する手段を提供します。 HTTP POSTリクエストは、XML-RPCメソッド呼び出しとして処理されます。 HTTP GETリクエストは、pydocスタイルのHTMLドキュメントを生成することによって処理されます。 これにより、サーバーは独自のWebベースのドキュメントを提供できます。

DocCGIXMLRPCRequestHandler.set_server_title(server_title)
生成されたHTMLドキュメントで使用されるタイトルを設定します。 このタイトルは、HTMLの「title」要素内で使用されます。
DocCGIXMLRPCRequestHandler.set_server_name(server_name)
生成されたHTMLドキュメントで使用される名前を設定します。 この名前は、生成されたドキュメントの上部の「h1」要素内に表示されます。
DocCGIXMLRPCRequestHandler.set_server_documentation(server_documentation)
生成されたHTMLドキュメントで使用される説明を設定します。 この説明は、ドキュメントのサーバー名の下に段落として表示されます。