xmlrpc.server — Базовые серверы XML-RPC
Исходный код: Lib/xmlrpc/server.py
Модуль xmlrpc.server предоставляет базовый серверный каркас для серверов XML-RPC, написанных на Python. Серверы могут быть самостоятельными, используя SimpleXMLRPCServer, или встроенными в среду CGI, используя CGIXMLRPCRequestHandler.
Предупреждение
Модуль xmlrpc.server не является защищенным от злонамеренно сконструированных данных. Если вам необходимо анализировать недоверенные или неавторизованные данные, см. Уязвимости XML.
Доступность: не WASI.
Этот модуль не работает или недоступен в WebAssembly. Для получения дополнительной информации см. Платформы 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 равно 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) -
Создает новый экземпляр для обработки запросов 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, демонстрирует сервер, позволяющий использование имён с точками и регистрацию функции 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-документации. Это описание будет отображаться как абзац, ниже имени сервера, в документации.
Обработчик запросов DocCGIXMLRPC
Класс 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.13/library/xmlrpc.server.html