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-документации. Это описание будет отображаться в документации в виде абзаца под именем сервера.