Spec-Zone.ru › Python 3.12

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

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

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

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

Модуль xmlrpc.server не защищен от злонамеренно сконструированных данных. Если вам нужно обработать недоверенные или неавторизованные данные, см. Уязвимости XML.

Доступность: не Emscripten, не WASI.

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

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 истинно (по умолчанию), запросы будут регистрироваться; установка этого параметра в ложь отключит регистрацию. Параметры allow_none и encoding передаются в xmlrpc.client и управляют ответами XML-RPC, которые будут возвращены сервером. Параметр bind_and_activate управляет тем, вызываются ли server_bind() и server_activate() конструктором сразу; по умолчанию он равен true. Установка его в ложь позволяет коду манипулировать переменной класса 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)

Создайте новый экземпляр для обработки запросов XML-RPC в среде CGI. Параметры 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 может быть задан только как ключевой аргумент для регистрации function под 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(), возвращается клиенту в качестве результата. Если instance не имеет метода _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)

Этот демонстрационный пример 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

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

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

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

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

Этот метод также может быть использован как декоратор. Когда используется как декоратор, name может быть указан только в качестве ключевого аргумента для регистрации function под именем 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; requestHandler по умолчанию равен DocXMLRPCRequestHandler.

Изменено в версии 3.3: Добавлен флаг use_builtin_types.

class xmlrpc.server.DocCGIXMLRPCRequestHandler

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

class xmlrpc.server.DocXMLRPCRequestHandler

Создаёт новый экземпляр обработчика запросов. Этот обработчик запросов поддерживает запросы XML-RPC POST, запросы документации GET и изменяет ведение журнала так, чтобы параметр 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-документации. Это описание будет отображаться как абзац, ниже имени сервера, в документации.

DocCGIXMLRPCRequestHandler

Класс DocCGIXMLRPCRequestHandler унаследован от CGIXMLRPCRequestHandler и предоставляет способ создания самодокументированных скриптов XML-RPC CGI. 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-документации. Это описание будет отображаться как абзац, ниже имени сервера, в документации.

© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/xmlrpc.server.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API