Spec-Zone.ru › Python 3.11

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. Установка его в 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)

Создаёт новый экземпляр для обработки запросов 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 multicall.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, демонстрирует сервер, позволяющий использовать имена с точками и регистрирующий функцию multicall.

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

Включение опции 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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/xmlrpc.server.html

Spec-Zone.ru

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