xmlrpc.server — Базовые XML-RPC-серверы

Исходный код: Lib/xmlrpc/server.py


Модуль xmlrpc.server предоставляет базовую серверную платформу для XML-RPC-серверов, написанную на Python. Серверы могут быть либо автономными, используя SimpleXMLRPCServer, либо встроенными в среду CGI, используя CGIXMLRPCRequestHandler.

Предупреждение

Модуль xmlrpc.server не защищен от вредоносных данных. Если вам нужно проанализировать данные, которым нельзя доверять или которые не прошли проверку подлинности, обратитесь к Важно отметить, что для модулей в пакете требуется, чтобы был доступен хотя бы один синтаксический анализатор XML, совместимый с SAX. Синтаксический анализатор Expat включен в состав Python, поэтому модуль всегда будет доступен..

Availability: это не Emscripten, это был не я.

Этот модуль не работает или недоступен на платформах WebAssembly wasm32-emscripten и wasm32-wasi. Дополнительную информацию смотрите в разделе Платформы веб-сборки.

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_buildin_types передается функции loads() и определяет, какие типы обрабатываются при получении значений даты/времени или двоичных данных; по умолчанию он имеет значение false.

Изменено в версии 3.3: Был добавлен флаг use_buildin_types.

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

Создайте новый экземпляр для обработки запросов XML-RPC в среде CGI. Параметры allow_none и encoding передаются в xmlrpc.client и управляют ответами XML-RPC, которые будут возвращаться с сервера. Параметр use_buildin_types передается функции loads() и определяет, какие типы обрабатываются при получении значений даты/времени или двоичных данных; по умолчанию он имеет значение false.

Изменено в версии 3.3: Был добавлен флаг use_buildin_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. Если 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() возвращается клиенту в качестве результата. Если у экземпляра нет метода _dispatch(), выполняется поиск атрибута, соответствующего имени запрашиваемого метода.

Если необязательный аргумент allow_dotted_names имеет значение true и у экземпляра нет метода _dispatch(), то, если запрашиваемое имя метода содержит точки, каждый компонент имени метода ищется индивидуально, в результате чего выполняется простой иерархический поиск. Затем вызывается значение, найденное в результате этого поиска, с параметрами из запроса, и возвращаемое значение передается обратно клиенту.

Предупреждение

Включение опции allow_dotted_names позволяет злоумышленникам получить доступ к глобальным переменным вашего модуля и может позволить им выполнять произвольный код на вашем компьютере. Используйте эту опцию только в защищенной закрытой сети.

SimpleXMLRPCServer.register_introspection_functions()

Регистрирует функции самоанализа XML-RPC system.listMethods, system.methodHelp и system.methodSignature.

SimpleXMLRPCServer.register_multicall_functions()

Регистрирует функцию многоразового вызова XML-RPC system.multicall.

SimpleXMLRPCRequestHandler.rpc_paths

Значение атрибута, которое должно быть кортежем, содержащим допустимые пути к частям URL-адреса для получения запросов XML-RPC. Запросы, отправленные по другим путям, приведут к ошибке HTTP 404 «нет такой страницы». Если этот кортеж пуст, все пути будут считаться допустимыми. Значение по умолчанию - ('/', '/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)

Этот пример демонстрационной версии сервиса можно вызвать из командной строки:

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

Обработчик запросов CGIXMLRPC

Класс CGIXMLRPCRequestHandler может использоваться для обработки запросов XML-RPC, отправляемых CGI-скриптам на Python.

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

Зарегистрируйте функцию, которая может отвечать на запросы XML-RPC. Если указано name, это будет имя метода, связанного с function, в противном случае будет использоваться function.__name__. name - это строка, которая может содержать символы, недопустимые в идентификаторах Python, включая символ точки.

Этот метод также можно использовать в качестве декоратора. При использовании в качестве декоратора name может быть задано только в качестве ключевого слова для регистрации функции под name. Если name не задано, будет использоваться function.__name__.

Изменено в версии 3.7: register_function() может использоваться в качестве декоратора.

CGIXMLRPCRequestHandler.register_instance(instance)

Зарегистрируйте объект, который используется для отображения имен методов, которые не были зарегистрированы с помощью register_function(). Если экземпляр содержит метод _dispatch(), он вызывается с запрошенным именем метода и параметрами из запроса; возвращаемое значение возвращается клиенту в качестве результата. Если у экземпляра нет метода _dispatch(), выполняется поиск атрибута, соответствующего названию запрошенного метода; если имя запрошенного метода содержит точки, выполняется поиск каждого компонента имени метода по отдельности, в результате чего выполняется простой иерархический поиск. Затем вызывается значение, найденное в результате этого поиска, с параметрами из запроса, и возвращаемое значение передается обратно клиенту.

CGIXMLRPCRequestHandler.register_introspection_functions()

Зарегистрируйте функции самоанализа XML-RPC system.listMethods, system.methodHelp и system.methodSignature.

CGIXMLRPCRequestHandler.register_multicall_functions()

Зарегистрируйте функцию многоразового вызова XML-RPC system.multicall.

CGIXMLRPCRequestHandler.handle_request(request_text=None)

Обработать запрос XML-RPC. Если задан request_text, это должны быть данные POST, предоставленные HTTP-сервером, в противном случае будет использовано содержимое 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

Эти классы расширяют вышеупомянутые классы для предоставления HTML-документации в ответ на запросы HTTP GET. Серверы могут быть либо автономными, используя DocXMLRPCServer, либо встроенными в среду CGI, используя DocCGIXMLRPCRequestHandler.

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

Создайте новый экземпляр сервера. Все параметры имеют то же значение, что и для SimpleXMLRPCServer; Обработчик запросов по умолчанию имеет значение DocXMLRPCRequestHandler.

Изменено в версии 3.3: Был добавлен флаг use_buildin_types.

class xmlrpc.server.DocCGIXMLRPCRequestHandler

Создайте новый экземпляр для обработки запросов XML-RPC в среде CGI.

class xmlrpc.server.DocXMLRPCRequestHandler

Создайте новый экземпляр обработчика запросов. Этот обработчик запросов поддерживает POST-запросы XML-RPC, запросы на получение документации и изменяет ведение журнала таким образом, чтобы параметр logRequests заменялся параметром конструктора DocXMLRPCServer.

Объекты DocXMLRPCServer

Класс DocXMLRPCServer является производным от SimpleXMLRPCServer и предоставляет средства для создания самодокументируемых автономных серверов XML-RPC. Запросы HTTP POST обрабатываются как вызовы методов XML-RPC. Запросы HTTP GET обрабатываются путем создания HTML-документации в стиле pydoc. Это позволяет серверу предоставлять свою собственную веб-документацию.

DocXMLRPCServer.set_server_title(server_title)

Задайте заголовок, используемый в сгенерированной HTML-документации. Этот заголовок будет использоваться внутри HTML-элемента «title».

DocXMLRPCServer.set_server_name(server_name)

Задайте имя, используемое в сгенерированной HTML-документации. Это имя будет отображаться в верхней части сгенерированной документации внутри элемента «h1».

DocXMLRPCServer.set_server_documentation(server_documentation)

Задайте описание, используемое в сгенерированной HTML-документации. Это описание будет отображаться в документации в виде абзаца под именем сервера.

Обработчик запросов DOCCGIXMLRPC

Класс DocCGIXMLRPCRequestHandler является производным от CGIXMLRPCRequestHandler и предоставляет средства для создания самодокументируемых CGI-скриптов XML-RPC. HTTP POST-запросы обрабатываются как вызовы методов XML-RPC. Запросы HTTP GET обрабатываются путем создания HTML-документации в стиле pydoc. Это позволяет серверу предоставлять свою собственную веб-документацию.

DocCGIXMLRPCRequestHandler.set_server_title(server_title)

Задайте заголовок, используемый в сгенерированной HTML-документации. Этот заголовок будет использоваться внутри HTML-элемента «title».

DocCGIXMLRPCRequestHandler.set_server_name(server_name)

Задайте имя, используемое в сгенерированной HTML-документации. Это имя будет отображаться в верхней части сгенерированной документации внутри элемента «h1».

DocCGIXMLRPCRequestHandler.set_server_documentation(server_documentation)

Задайте описание, используемое в сгенерированной HTML-документации. Это описание будет отображаться в документации в виде абзаца под именем сервера.

Вернуться на верх